python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等) (9)

首先我们要明白只要继承object类就是新式类,不继承object类的都是经典类。python3中所有的类都是继承object类,所以都是新式类,所以python3中所有类都是新式类。

经典类:在python3中不存在,在python2中不继承object的类都是经典类,继承object类的就是新式类。所以经典类在python3中不存在,在python2中不主动继承object的类。

# 以下两个是新式类,因为在python3中 # class A:pass # class A(object):pass # 在python2中 # class A:pass # 经典类 # class A(object):pass # 新式类

在单继承方面(无论是新式类还是经典类都是一样的,都是往深度找。遵循深度优先遍历的算法)

class A: def func(self): pass class B(A): def func(self): pass class C(B): def func(self): pass class D(C): def func(self): pass d = D() d.func()

上面代码寻找某一个方法的顺序(func函数):D-B-C-A-object。越往父类走,是深度。

在多继承方面(经典类的多继承的寻找顺序是符合深度优先遍历。新式类是广度优先遍历,同时也遵循C3算法)

# class A: # def func(self): # print(\'a\') # # # class B(A): # def func(self): # print(\'b\') # # class C(A): # def func(self): # print(\'c\') # # # class D(B,C): # def func(self): # print(\'d\') # # d = D() # d.func() # d # class A: # def func(self): # print(\'a\') # # # class B(A): # def func(self): # print(\'b\') # # class C(A): # def func(self): # print(\'c\') # # # class D(B,C): # pass # # d = D() # d.func() # b # class A: # def func(self): # print(\'a\') # # # class B(A): # pass # # class C(A): # def func(self): # print(\'c\') # # # class D(B,C): # pass # # d = D() # d.func() # c # # class A: # def func(self): # print(\'a\') # # # class B(A): # pass # # class C(A): # pass # # # class D(B,C): # pass # # d = D() # d.func() # a

在走到一个点,下一个点既可以从深度走,也可以从广度走的时候,总是先走广度,再走深度,这一个过程就叫做广度优先遍历。

经典类---经典类的多继承的寻找顺序是符合深度优先遍历。在走到一个点,下一个点既可以从深度走,也可以从广度走的时候,总是先走深度,再走广度,这一个过程就叫做深度优先遍历。深度优先类,在找方法的时候,总是先往深了找,一直找到头,没有再找下一条线。在经典类中,都是深度优先,总是在一条路走不通之后再换一条路,走过的点不会再走了。

新式类---新式类的多继承的寻找顺序是符合广度优先遍历同时也遵循C3算法。

class A: def func(self): print(\'a\') class B(A): def func(self): print(\'b\') class C(A): def func(self): print(\'c\') class D(B,C): def func(self): print(\'d\') d = D() d.func() # D->B->C->A # [<class \'__main__.D\'>, <class \'__main__.B\'>, <class \'__main__.C\'>, <class \'__main__.A\'>, <class \'object\'>] print(D.mro())

以下是我们掌握新式类算法的推理过程图:

|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|
|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|
|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|
|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|
|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|
|

python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

|

经典类---深度优先 新式类---广度优先

深度优先遍历算法,先要会自己看,自己能搞出顺序来。

广度优先遍历算法遵循C3算法,要会用mro,会查看顺序。经典类没有mro,但是新式类有。

4)多态

我们知道python一切皆对象,同时python处处是多态。

# 多态是站在java的角度来讲述 # python中的参数是没有类型的约束的,在执行的过程当中python解释器会自动的识别这个是什么类型的,但是java的参数必须指明数据类型。 # def add(a,b): # return a+b # print(add(1,2)) # print(add(1,\'adaduqwhdu\')) # TypeError: unsupported operand type(s) for +: \'int\' and \'str\' # class Payment:pass # # # 微信支付的类 # class WeChat(Payment): # def __init__(self, name): # self.name = name # # def pay(self, money): # dic = {\'username\': self.name, \'money\': money} # # 想办法调用微信支付的url连接,把dic传递过去 # print(\'%s通过微信支付%s钱成功\' % (self.name, money)) # # # # 苹果支付类 # class Apple(Payment): # def __init__(self, name): # self.name = name # # def pay(self, money): # dic = {\'name\': self.name, \'number\': money} # # 想办法调用微信支付的url连接,把dic传递过去 # print(\'%s通过微信支付%s钱成功\' % (self.name, money)) # java实现方式 # def pay(Payment obj,int money): # obj.pay(money) # # obj = Apple(\'alex\') # pay(obj,400) # # obj = WeChat(\'alex\') # pay(obj,400)

总结:一种类型表现出来的多种状态

支付表现出的微信支付和苹果支付的两种状态

在java情况下:一个参数必须指明指定类型

所以如果想让两个类型的对象都可以传,那么必须让这两个类继承自一个父类,在指定类型的时候使用我们的父类来指定类型

python处处是多态

5)封装

封装:就是把属性和方法装起来就是封装。

封装有两种:

一种是广义上的封装:大家都基本认可的封装。把属性和方法装起来,不能直接调用了。只能通过类和对象调用。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdxxf.html