python是函数式编程+面向对象编程
面向对象三大特性:封装、继承、多态,而python是原生多态。
面向对象适用场景:如果多个函数中有一些相同的参数时,适用面向对象编程。
1.创建类(封装)
class Foo:
def foo(self,arg):
pass
创建中间人:
注意self永远代指中间人,即调用方法的对象,(在继承里也是),中间人可以存值,这就是封装的一个小例子,当然实际并不这样封装。
obj=Foo()
obj.foo()
在obj=类名()这一步时,做了两件事:一是创建了obj对象,二是通过对象执行类中的一个特殊方法,自动执行。
特殊方法名为构造方法,初始化:
def __init__(self):
pass
特性:类名()--->自动执行构造方法
————————————————————————————
class Bar:
def __init__(self,age):
self.age=age
#在这里进行age的封装(公用对象)
def foo(self,arg):
print(self,self.name,self.age,arg)
z=Bar(21)#21是给__init__传参数
z.name='axe'#给self封装一个name='axe'
z.foo(666)
结果:
<__main__.Bar object at 0x000034243....> axe 21 666
2.继承:
链式查找方法,父类—子类(基类—派生类)
class grad_father:
def a(self):
pass
class father(grad_father):
def b(self):
pass
class son(father):
def c(self):
pass
obj=son()
obj.a()--->可以调用
obj.b()--->可以调用
obj.c()--->可以调用
————————————————————————————
如果不想调用父类的方法,只需要在子类里重名父类的方法名即可。
class father:
def b(self):
pass
class son(father):
def c(self):
pass
def b(self):
pass
obj=son()
obj.b()--->这里调用的是子类自己的b()方法
————————————————————————————
如果想子类和父类重名的都调用,有两种方式。
(一)
class father:
def b(self):
pass
class son(father):
def c(self):
pass
def b(self):
super().b()
pass
(二)
class father:
def b(self):
pass
class son(father):
def c(self):
pass
def b(self):
father.b(self)
pass
————————————————————————————
多继承:
深度优先:左侧优先,一条道走下去查找。
广度优先:同一个根源时,根源最后执行(c3算法)
新式类采取两者结合的方式,不是同一个根源,那么就采用深度优先。
obj.mro()#查找继承顺序,只在新式类中,当然python3都是新式类
class f1:
def a(self):
pass
class f2:
def a(self):
pass
class s(f1,f2)
obj=s()
obj.a