Day16--Python--初识面向对象
今日主要内容
一. 面向对象思想
1. 面向过程. 重点在'过程'. 按照事物迭代发展流程.
优点: 简单,流水线式的操作
缺点: 可扩展性差.可维护性差.
2. 面向对象. 对象是属性和动作的集合体.对象是一个抽象概念
重点在'对象':属性和动作.
(先创建一个大象,然后让大象进冰箱就可以了,具体大象如何进的冰箱由大象来完成.)
类似上帝式思维. 优点: 可扩展性强(多态)
缺点: 编写相对比较复杂. 上手比较难. 面向对象和面向过程各有千秋 二. 面向对象如何编写
在代码中定义一个类,相当于画图纸
class 类名: #驼峰,类名首字母大写
pass 创建对象: 类名()
1. 构造方法:
def __init__(self, 属性):
self.属性 = 属性
2. 普通方法
def 方法名(self, 参数列表):
pass
self: 表示当前类的对象. 当前正在执行这个动作的对象.
对象.方法()
类名.方法(对象,参数) e.g.
#定义一辆车
class Car:
#出厂设置 (__init__) 构造方法,所有方法的第一个参数不用给
def __init__(self, colour, pai, pailiang, own) #self 表示当前类的对象
print('我在造车')
print(self)
#绑定属性.
# self.colour = '红色'
# self.pai = '京A66666'
self.colour = colour
self.pai = pai
self.pailiang = pailiang
self.own = own c = Car('黑色', '黑B88888', '2.0t', 'alex')
c1 = Car() 系统会自动调用__init__方法.并将Car()传给self
c2 = Car() 自动调用__init__函数(方法) #创造一辆车,创建对象
c= Car() #类名()
print(type(c)) #<class '__main__.Car'> c1 = Car() #创建新对象,又叫做实例化 #类是一个概念. 对象:具体的实例
c1.colour = '白色'
c1.pai = '京B22222'
c1.pailiang = '1.6t'
c1.own = '小猪佩奇'
print(id(c), id(c1))
print(c1.pai)
print(c.own) #函数(方法) class Car():
def __init__(self, colour, pai, pailiang, own):
self.colour = colour
self.pai = pai
self.pailiang = pailiang
self.own = own #车能跑,跑是一个动作,要写函数(方法)
def run(self): #self: 当前类的对象
print('%s颜色的车在疯狂的跑' % self.colour)
print(self) c1 = Car('红','京A11111', '1.5L', '小猪佩奇')
c1.run() #对象,方法() 用谁访问,self就是谁 --------------------------------------
class House:
pass h = House()
h.colour = '红色'
h.size = '500平米'
h.floor = '两层'
h.owner = 'Sara' print(type(h)) h1 = House()
h1.colour = '白色'
h1.size = '250平米'
h1.floor = '1层'
h1.owner = 'John' print(id(h), id(h1))
print(h1.colour)
print(h.colour) --------------------------------------------
class Meal:
def __init__(self):
self.food = '米饭'
self.dish = '鱼香肉丝'
self.drink = '可乐' m = Meal()
print(m.food)
m.dish = '宫保鸡丁'
print(m.dish) m1 = Meal()
print(m1.dish) ---------------------------------------------
class House:
def __init__(self, colour, size, floor, owner):
self.colour = colour
self.size = size
self.floor = floor
self.owner = owner H1 = House('红色', '1000平米', '4层', '王尔德')
print(H1)
print(H1.colour)
print(H1.size) H2 = House('米黄', '500平米', '2层', '布莱曼')
print(H2.colour)
print(H2.size)
print(H2)
class HaoHan: # 驼峰. 类名首字母大写.
def __init__(self, name, waihao, jineng):
self.name = name
self.waihao = waihao
self.jineng = jineng def ganLaoHu(self):
print("%s, %s 在干老虎" % (self.waihao, self.name)) def shaSaoZi(self):
print("%s, %s 在杀嫂子" % (self.waihao, self.name)) def tiTianXingDao(self):
print("%s, %s 在替天行道" % (self.waihao, self.name)) wusong = HaoHan("武松", "行者", "喝酒") wusong.ganLaoHu()
wusong.shaSaoZi()
wusong.tiTianXingDao()
构造方法
class HeShang: def __init__(self, fahao, mingzi, age, miao):
self.fahao = fahao
self.mingzi = mingzi
self.age = age
self.miao = miao def nianjing(self):
print("%s在念经" % self.fahao) def quxifu(self, xifu):
print("%s取了个媳妇:%s" % (self.fahao, xifu)) hs = HeShang("秃驴", "alex", 38, "路飞庙")
hs.nianjing()
hs.quxifu("wusir")
普通方法
class Account: def __init__(self, username, pwd):
self.username = username
self.pwd = pwd def login(self):
if self.username == 'alex' and self.pwd == '':
return True
else:
return False acc = Account('alex', '')
print(acc.login())
用户登录
三. 面向对象和面向过程的对比(代码,思想)
结论: 根据不同的业务逻辑, 来决定用哪种思想. 面向对象PK面向过程
装大象, 脚本
print("打开冰箱门")
print("装大象")
print("关上冰箱门") 函数式编程
def kaimen():
print("打开冰箱门")
def zhuangdaxiang():
print("装大象")
def guanmen():
print("关门")
kaimen()
zhuangdaxiang()
guanmen() 面向对象
class Elephant: def open(self):
print("大象会开门")
def zhuang(self):
print("把自己装进去")
def close(self):
print("把门关上") # 创建大象
e = Elephant()
e.open()
e.zhuang()
e.close() # 第一回合. 面向过程赢
# 第二回合. 小猪佩奇(name, age, 技能)大战奥特曼, 蜘蛛侠, 蝙蝠侠
# 函数式
def da_ao_te_man(name, age, jineng):
print("%s, %s岁了, 用技能%s 打奥特曼" % (name, age, jineng))
def da_zhi_zhu_xia(name, age, jineng):
print("%s, %s岁了, 用技能%s 打蜘蛛侠" % (name, age, jineng))
def da_bian_fu_xia(name, age, jineng):
print("%s, %s岁了, 用技能%s 打蝙蝠侠" % (name, age, jineng)) da_ao_te_man("小猪佩奇", 40, "嘴巴嘟嘟")
da_zhi_zhu_xia("小猪佩奇", 40, "嘴巴嘟嘟")
da_bian_fu_xia("小猪佩奇", 40, "嘴巴嘟嘟") # 面向对象
class Pig: def __init__(self, name, age, jineng):
self.name = name
self.age = age
self.jineng = jineng def da_ao_te_man(self):
print("%s, %s岁了, 用技能%s 打奥特曼" % (self.name, self.age, self.jineng))
def da_zhi_zhu_xia(self):
print("%s, %s岁了, 用技能%s 打蜘蛛侠" % (self.name, self.age, self.jineng))
def da_bian_fu_xia(self):
print("%s, %s岁了, 用技能%s 打蝙蝠侠" % (self.name, self.age, self.jineng)) peiqi = Pig("小猪佩奇", 40, "嘴巴嘟嘟") # 把这三个属性封装到了一个对象里.
peiqi.da_ao_te_man()
peiqi.da_zhi_zhu_xia()
peiqi.da_bian_fu_xia() # 平手. 当属性和方法非常多的时候, 才能感觉到面向对象的好.
# 你要知道. 面向对象和面向过程都是思想. 用哪一个取决于业务逻辑.
四. 面向对象的三个特征(记下来)
1. 封装: 把具有相同属性和功能的内容封装在一个对象中
2. 继承: 子类可以自动拥有父类中 除了私有属性外的其他所有内容. 好处:两个类具有相同的功能或特征时,可以避免写很多重复的功能和代码.
3. 多态: 同一类的对象. 可以拥有多种形态,本质是子类通过重写父类的方法,使得对同一类对象调用同一个方法,产生不同结果. python原生自带多态性. e.g.父类中定义了eat方法,子类中又重新定义了eat方法. 继承
class Fa:
def play(self):
print('Fa中的play')
def func(self):
print('我是一号') class Fa2:
def play(self):
print('Fa2中的play')
def tool(self):
print('我是2号') class Son(Fa, Fa2): #可以从多个类中继承,调用顺序先找自己,再从左到右按顺序继承
pass s = Son()
s.func()
s.tool()
s.play()
一个子类继承多个父类
class Pet:
def __init__(self, name):
self.name = name def eat(self):
print('吃')
def sleep(self):
print('睡') class Cat(Pet):
def catch_mouse(self):
print('%s喜欢抓老鼠' % self.name) class Dog(Pet):
def chaijia(self):
print('%s喜欢拆家' % self.name) c = Cat('Tom')
c.catch_mouse()
c.eat()
c.sleep() d = Dog('John')
d.chaijia()
d.eat()
d.sleep()
多个子类继承一个父类
多态
# # 变量 = 类名()
# c = Cat() # 猫类型的
# python本来就是多态. 里面没有所谓的类型. class Animal:
def chi(self):
print("所有的动物都会吃") class Haski(Animal):
def chi(self):
print("疯了一样的吃") class Monkey(Animal):
def chi(self):
print("龇牙咧嘴的吃") class Tiger(Animal):
def chi(self):
print("跟猫一样的吃") class Elephant(Animal):
def chi(self):
print("大象用鼻子卷着吃") class YingWu(Animal):
def chi(self):
print("xxxxx") class SiYangYuan:
def wei(self, ani): # 多态性. 超强的可扩展性. 不论传递进来的是什么. 都统一当成动物来对待.
ani.chi() syy = SiYangYuan() # 造动物
hou = Monkey()
ha = Haski()
lao = Tiger()
yw = YingWu() syy.wei(ha)
syy.wei(hou)
syy.wei(lao)
syy.wei(yw)
class Car:
def run(self, speed):
print("车能跑%s迈" % speed) c = Car() # 实例化一个对象
Car.run(c, 50)
c.run(50)
类.动作(对象,参数) = 对象.动作(参数)
Day16--Python--初识面向对象的更多相关文章
- python - 初识面向对象
1.初识面向对象 面向过程:一切以事务的发展流程为中心 优点:负责的问题流程化,编写相对简单 缺点:可扩展性差,只能解决一个问题,改造也会很困难,牵一发 ...
- Python初识面向对象
初识面向对象 面向过程 VS 面向对象 面向过程的圣墟设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西 优点是:极大的降低 ...
- python之路--初识面向对象
一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...
- python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)
一.组合 表示的一种什么有什么的关系 先来说一下,__init__的作用 class Dog: def __init__(self, name, kind, hp, ad): self.name = ...
- python全栈开发从入门到放弃之初识面向对象
面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复 ...
- 巨蟒python全栈开发-第16天 核能来袭-初识面向对象
一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...
- python基础(23):面向过程与面向对象的优劣、初识面向对象
1. 面向过程与面向对象的优劣 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程 ...
- Python 入门 之 初识面向对象
Python 入门 之 初识面向对象 1.初识面向对象编程 (核心--对象) (1)观察以下代码: # 面向过程编程 s = "alexdsb" count = 0 for i i ...
- 【学习笔记】--- 老男孩学Python,day16-17 初识面向对象,类名称空间,查询顺序,组合
面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复 ...
- python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象
一. 面向对象的引入# 人狗大战 def person(name,HP,aggr,sex): person = { 'name':name, # 昵称 'HP':HP, # 生命值 'aggr':ag ...
随机推荐
- WPF通过DynamicResource实现给界面动态更换皮肤
在我们的程序中有时候需要去实现动态更换皮肤的效果,从而完成一些个性化的设置,那么我们究竟怎样去实现动态换皮肤的效果呢?那么我们经常用到的就是设置不同的Style,并且在主程序的xaml文件中通过Dyn ...
- java 中的Collection
/* *一. Collection?-------->容器! * * 1.来源于java.util包 非常实用的数据结构! * *二. 方法? * * void clear()删除集合中所有元素 ...
- 三、oneinstack
一.介绍 oneinstack https://www.cnblogs.com/lxwphp/p/9231554.html
- 解决post、get端中文乱码问题
在web.xml中配置: <filter> <filter-name>CharacterEncodingFilter</filter-name> <filte ...
- Linq:使用Take和Skip实现分页
Skip,Take: list = list.Skip(pageNum * pageSize).Take(pageSize).ToList(); pageSize :表示一页多少条. pageNum: ...
- How to install Niresh Mavericks on PC
ed2k://|file|osx-mavericks.dmg|5653921792|f789090803e9b2c8d582813c0d4a33bf|/ diskutil list diskutil ...
- cuda编程-矩阵乘法(2)
采用shared memory加速 代码 #include <stdio.h> #include <stdlib.h> #include <math.h> #inc ...
- Servlet篇 之 web服务器
创建web项目,在web项目中创建html页面,然后把项目部署到web服务器里面,启动服务器之后,可以使用浏览器通过URL地址的方式,访问到web项目中的html页面了 Web服务器: 常用tomca ...
- 洛谷 P2151 [SDOI2009]HH去散步
题目链接 思路 如果没有不能走上一条边的限制,很显然就是dp. 设f[i][j]表示到达i点走了j步的方案数,移到k点可以表示为f[k][j+1]+=f[i][j]. 如果有限制的话,可以考虑用边表示 ...
- 通过流量清理防御DDoS
导读 在2018年2月,世界上最大的分布式拒绝服务(DDoS)攻击在发起20分钟内得到控制,这主要得益于事先部署的DDoS防护服务. 这次攻击是针对GitHub–数百万开发人员使用的主流在线代码管理服 ...