python 面向对象(一)
一、创建类和对象
#编写一个类 class Func: #定义了一个类 def __init__(self,name): # 构造方法 self.name = name def f1(self): #在类中编写了一个方法 pass #执行类中方法的流程: obj = Func("Tom") #实例化一个对象 obj.f1() #通过这个对象调用方法
如何归类:
正向:归类+提取公共值
反向:类的相关功能+提取公共值
构造方法:
class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender obj = Person("Tom", 20, "男")
1.构造方法目的是将数据进行初始化。
2.应用:
1.将数据封装到对象中,以供自己在方法中调用。
2.将数据封装到对象中,以供其他函数调用。
self
self是一个形式参数,当实例化一个对象 obj = Foo()时,self 就等于 obj
二、面向对象的三大特性:封装/继承/多态
1.封装
1.将相关功能封装到一个类中
class Message: def emall(self): pass def mage(self): pass def wechat(self): pass
2.将数据封装到一个对象中
#继承编写: class A: #父类/基类 def f1(self): print("A1") def f3(self): print("A3") class B(A): #子类/派生类 def f1(self): print("B1") def f2(self): self.f3() print("B2") obj = B() obj.f2()
原则:在自己类中找,没有就去父类找。
多继承
python支持多继承,(父类1,父类2)先找左边。
class A: def f1(self): print("A1") def f3(self): print("A3") class B: def f1(self): print("B1") def f2(self): self.f1() print("B2") class C(A,B): def func(self): self.f2() print("func") obj = C() obj.func()
多继承提高代码重用性。
补充:
经典类和新式类
python2 中 有经典类和新式类,如果自己或自己的基类中有人继承了object,那就是新式类,如果没有人继承就是经典类
python3中没有了经典类和新式类之分,只有新式类,如果类没有继承的父类,则自动继承object
经典类和新式类的查找顺序
经典类:深度优先
新式类:C3算法
C3算法:
class A(object): pass class B(A): pass class C(A): pass class D(B, C): pass obj = D()
#D类的查找顺序:L(D) = (D,B,A,object) + (D,C,A,object)
#D,B,C,A,object
print(D.__mro__)
原理:获取第一个表头,和其他表尾巴进行比较,不存在则拿走,如果存在则放弃,然后获取第二个表的表头,再次和其他表的表尾进行比较。
__mro__ :也可以使用__mro__ 方法,来查看查找顺序。
注意事项:
super是遵循了__mro__执行顺序
3.多态
多种形态或多种状态
鸭子模型,只要可以嘎嘎叫就是鸭子
由于python原生支持多态,所以没有特殊性
class Foo1: def f1(self): pass class Foo2: def f1(self): pass class Foo3: def f1(self): pass def func(arg): arg.f1() obj = Foo1() # obj= Foo2() obj = Foo3() func(obj)