面向对象
一,什么是面向对象?
面向对象是一种设计模式,它是基于面向过程而言的,python和其他语音相比较,函数式编程也占据了很大一部分.
我的理解就是面向对象抛弃了以函数为实现功能的基本的单元的设计模式 , 转换为把对象当成基本单元来进行编码.那么什么是对象?
二,什么是对象?
对象就是把复杂的事物简单化 , 然后呢所有的对象都可以用两个东西来进行描述 . 1,它长什么样 2,它能做什么
注意要抽象的理解这两个概念,比如说网络游戏中你的角色,我们通过你角色的[职业,力量,体质,敏捷]和你所拥有的技能来描述你的这个角色.
这里的[职业,力量,体质,敏捷]就是它长什么样,拥有的技能就是它能做什么.
当我们创建完这个角色,就可以指挥它去做它可以做的事.下面通过一段代码来加深理解.
class Role: """ 创建一个游戏角色 """ def __init__(self,occupation,power,agility,constitution): self.occupation = occupation self.power = power self.constitution = constitution self.agility = agility def skill(self): if self.occupation == "战士": print("使用技能:大地震颤") def forge(self): if self.power >10: print("打造 : 精良的破旧柴刀*1") def collect(self): if self.agility >50: print("采集到 : 犀龙角*1") def marry(self): if self.constitution > 999: print("对我的肾反射区猛攻") me = Role("战士",666,888,9999) # me就是我创建的角色(对象) me.skill() #使用技能:大地震颤 me.marry() #对我的肾反射区猛攻 me.forge() #打造 : 精良的破旧柴刀*1 me.collect() #采集到 : 犀龙角*1
三,面向对象的编写方法
如果是一个python程序员,一定很熟悉函数式编程,那么接下来我就介绍一种可以马上把代码转换为面向对象模式的方式.当然面向对象的方法并不是适合编辑所有的代码.
先对自己所写的函数进行归类,然后提取公共值.
def man_run() pass def man_speak() pass def woman_run() pass def woman_pregnancy() pass 转换.. class man: def man_run(self): pass def man_speak(self): pass class woman: def woman_run(self): pass def woman_pregnancy(self): pass
代码中一目了然,面向对象的编写方式就是定义一个类,然后把修饰同一个对象的函数包含到这个类中用来描述实例化对象,
当然这段代码并没有实例化对象的过程,应该在定义完类之后,加上构造方法,这个之后会进行介绍.函数加上self参数就成为了我们所说的方法,self代表的是实例化的对象。
四, 面向对象的三个特性
在介绍特性之前先说明一下初始化方法__init__,它和构造方法__new__一直是容易被人混淆的概念.
__init__(self)就是构造方法,其中可以传递参数,参数也就是之前游戏角色中的人物的属性值, self代表了它所实例化的对象.下面举例说明.
class man: def __init__(self,name,age,job): self.name = name self.age = age self.job = job
def fight(self):
pass obj = man("李云龙","40","军人") #实例化了一个对象
obj.fight() #方法的调用
一, 封装
封装指的是两方面 , 一方面把相关的功能归纳到一个类中, 另一方面把数据封装到对象中.
class man: def __init__(self,name,age,job): #把数据封装到对象中 self.name = name self.age = age self.job = job #把相关功能封装到类中 def run(self): pass def speak(self): pass
二,继承
继承就是为了提升代码的复用性而出现的. 格式如下
class Base: #Base 被称为父类或者基类 pass class Foo(Base): #Foo被称为子类或派生类 pass
原则就是先在子类中找,没有的话就去父类中寻找.
python支持多继承, 形如下图,它的优先级为从左到右.如果Base中 没有寻找到,就会去Stack中寻找.
class Foo(Base,Stack): pass
三, 多态
多态指的是一个变量可以有多种状态或者多种形态, python原生支持多态, 提倡鸭子模型, 就是说只要能够嘎嘎叫, 就是鸭子这样的思想.例如在我们定义一个函数的时候,为它传递参数,不用特意制定它的数据类型,只要能满足接下来定义的功能就可以
在其他一些语言中,如java, 定义一个 public void (数组,参数) 它指的就是列表类和列表的子类的对象.
五,成员
成员有三种,字段, 方法, 属性
字段 分为 普通字段和静态字段,
class Company: #静态字段 city = "北京" def __init__(self,name): #普通字段 self.name = name
方法分为 静态方法,类方法,实例方法
class Company: def __init__(self,name): self.name = name #实例方法 #使用实例变量 def func1(self): print(self.name) #静态方法 不需要调用对象封装的值,就可以不把对象传递 @staticmethod def func2(): print("a") #类方法 不使用对象封装的值 把Company作为参数传递到func3,供其使用 @classmethod def func3(cls): return cls
属性, 作用是把方法进行改造, 在其调用的时候不用加括号,多使用在结构简单且有返回值的方法中.
class School: # 属性 @property def func1(self): return 2
特殊成员方法==>__new__ 构造方法,创建一个个空白的对象
__init__ 初始化方法,吧对象初始化
__call__ 对象名+括号是直接调用
__add__ 可以想成是字符串的相加,对象名+对象名直接调用
__getitem__ 可以联系到字典的取值, 对象名["xx"]
__delitem__ del 对象名["xx"]
__setitem__ 看成字典的创建新的键值对 对象名["xx"] = "yy"