进击のpython
多重継承
多重継承?多重継承とは何ですか?それは聖歌以上を継承することです!
これは、ああを理解することがより簡単です!
どのようにそれは、多重継承と呼ばれていますか?
猿はそれを知っています!
サル!神に!
力でその2人の親ではありません!
次に、どのように継承するには?
あなたの街、考えていない2??
ああ類推を学ぶために、右!
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/
class Shenxian:
print("我是神仙,法力无边!")
pass
class Monkey:
print("我是猴子,我贼流弊!")
pass
class Sunwukong(Monkey, Shenxian):
pass
Sunwukong()
我是神仙,法力无边!
我是猴子,我贼流弊!
あなたが見ることができる。この時点で、私はこのクラスを孫悟空
これは、プロパティshenxianと猿を継承しました
もちろん、孫悟空はそのメソッドを継承することができます
# -*- coding: utf-8 -*-
# @Time : 2019.07.17
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/
class Shenxian:
def shen(self):
print("我是神仙,法力无边!")
pass
class Monkey:
def hou(self):
print('我是猴子,我贼流弊!')
pass
class Sunwukong(Shenxian, Monkey):
def sun(self):
print("齐!天!大!圣!")
pass
s = Sunwukong()
見て、インスタンス化するとき、私はメソッドを呼び出すとき
親クラスからファンクションは、それはとも呼ばれることができません
承継の順序
ハは、非常にシンプルに見えますが、ああ、それだけではなく、
あなたは、ああ、houziはまた、動物を継承していない参照してください?
動物はまた、生物学を継承しないのですか?
生物学にも継承されていません......
我々は短期的にそれを展開すると、それがたくさんあります!
この問題を検討する前に
それも解決されていない問題を持っていないですか?
私はクラスと猿のクラスをshenxian場合つまり、
食べる私は孫悟空たときに呼び出されるメソッドを、持っています
どれが?
# -*- coding: utf-8 -*- # @Time : 2019.07.17 # @Author : 爪爪 # @Url : https://www.cnblogs.com/jevious/ class Shenxian: def shen(self): print("我是神仙,法力无边!") pass def eat(self): print("神仙吃东西!") class Monkey: def hou(self): print('我是猴子,我贼流弊!') pass def eat(self): print("猴子吃东西!") class Sunwukong(Shenxian, Monkey): def sun(self): print("齐!天!大!圣!") pass s = Sunwukong() s.eat()
ヒントshenxianから食べる方法の例からもわかります
最終的にはそれはそれではないでしょうか?
それを実行します!
神仙吃东西!
案の定、実行のメソッド内で食べshenxianです
だから、コンセプトは、この継承ああ、おそらくそこにあります
それは順序であります
まず、メソッド内shenxianを継承し、その後、この方法は、サルを継承しました
上記の対象が繰り返される(shenxianフロントモンキー)
しかし、あなたは思いますか
これは逃げますか?
私は以前その質問に言及したと同じように
その場合は、連続の順序はどのようなことでしょうか?????
# -*- coding: utf-8 -*- # @Time : 2019.07.17 # @Author : 爪爪 # @Url : https://www.cnblogs.com/jevious/ class Super_shenxian: def eat(self): print("超级神仙吃东西!") pass class Shenxian(Super_shenxian): def shen(self): print("我是神仙,法力无边!") pass def eat(self): print("神仙吃东西!") class Shengwu: def eat(self): print("生物吃东西") pass class Monkey(Shengwu): def hou(self): print('我是猴子,我贼流弊!') pass def eat(self): print("猴子吃东西!") class Sunwukong(Monkey, Shenxian): def sun(self): print("齐!天!大!圣!") pass s = Sunwukong() s.eat()
実装前に、まずこのプログラムの継承を分析します
それはありませんが、これはそれです!大丈夫
私たちは、フォローしたいこと
2つの検索方法のいずれかでなければなりません
sunwukong⇨monkey⇨shengwu⇨shenxian⇨super_shenxian
この検索メソッドが呼び出され、深さ優先
sunwukong⇨monkey⇨shenxian⇨shengwu⇨super_shenxian
この検索メソッドが呼び出され、幅優先
それは我々がそれに従う継承何ですか?
上記のコードを実行します
猴子吃东西!
しかし、それはまた、深さや幅を決定することはできません
ある場合はshengwu方法を食べます
shenxian也有eat方法
但是monkey没有eat方法
那我要是执行结果是“神仙吃东西”
是不是就代表着是广度优先?
同理,我要是执行结果是“生物吃东西”
是不是就代表着是深度优先?
这个逻辑能理解吧
那我们试一下
# -*- coding: utf-8 -*- # @Time : 2019.07.17 # @Author : 爪爪 # @Url : https://www.cnblogs.com/jevious/ class Super_shenxian: def eat(self): print("超级神仙吃东西!") pass class Shenxian(Super_shenxian): def shen(self): print("我是神仙,法力无边!") pass def eat(self): print("神仙吃东西!") class Shengwu: def eat(self): print("生物吃东西") pass class Monkey(Shengwu): def hou(self): print('我是猴子,我贼流弊!') pass # def eat(self): # print("猴子吃东西!") class Sunwukong(Monkey, Shenxian): def sun(self): print("齐!天!大!圣!") pass s = Sunwukong() s.eat()
执行结果是:
生物吃东西
那说明什么?说明继承是深度优先是吧!
逻辑没问题吧!
你以为???这就结束了???
真◇继承顺序
在python中啊,类的写法有两种
经典类:
class A: pass
新式类:
class B(object): pass
而python呢,又有两种版本 2.x 和 3.x
所以就出现了四种组合情况是吧!
在2.x版本中,经典类采用的是深度优先,新式类采用的是广度优先
在3.x版本中,无论新式类还是经典类,都是按广度优先查找的
在2.x中默认的都是经典类,只有显示继承了object才是新式类
在3.x中默认的都是新式类,不必显示继承object
等会???????????????
刚才咱们实验出来了,3.x版本是深度优先啊!
怎么你现在跟我说是广度优先???????
kidding me???????????????
别骂人别骂人!听我
狡辩说啊!
有没有这种情况?
我的super_shenxian 和 shengwu 的上面还有个爹
shijie!
可以不!
shijie里面也有eat方法行不
我把houzi的eat取消掉
我再把shengwu的eat取消掉
那我查找的时候是不是应该继续找shengwu的父亲
也就是shijie!
然后执行shijie里面的eat是吧
最后打印”世界吃东西“是吧
这是咱们原先的逻辑,没问题吧!
写一下行吧
# -*- coding: utf-8 -*- # @Time : 2019.07.17 # @Author : 爪爪 # @Url : https://www.cnblogs.com/jevious/ class Shijie(object): def eat(self): print("世界都在吃东西!") pass class Super_shenxian(Shijie): def eat(self): print("超级神仙吃东西!") pass class Shenxian(Super_shenxian): def eat(self): print("神仙吃东西!") class Shengwu(Shijie): # def eat(self): # print("生物吃东西") pass class Monkey(Shengwu): # def eat(self): # print("猴子吃东西!") pass class Sunwukong(Monkey, Shenxian): def sun(self): print("齐!天!大!圣!") pass s = Sunwukong() s.eat()
你打印出来的是什么??大声告诉我!
是不是”世界吃东西“?
不是!
是什么?
神仙吃东西!
是不是就不是深度优先原则了????
那他到底是什么优先呢???????
其实好多都在说是广度优先
但是很明显,当没有交集的时候,依照的是的是深度优先
有交集又用的是类广度有限的算法
那到底是什么!!!!!!!!!!!!!
多继承C3算法
上面的都算简单的,来来来,看看这个?
# -*- coding: utf-8 -*- # @Time : 2019.07.17 # @Author : 爪爪 # @Url : https://www.cnblogs.com/jevious/ class A: def test(self): print('from A') class B(A): # def test(self): # print('from B') pass class B2: def test(self): print('from B2') class C(A): def test(self): print('from C') class C2: def test(self): print('from C2') class D(B, B2): # def test(self): # print('from D') pass class E(C, C2): def test(self): print('from E') class F(D, E): # def test(self): # print('from F') pass f1 = F() f1.test()
输出结果自己打印┗|`O′|┛ 嗷~~
那这个继承关系是什么呢????
来,我的好兄弟
告诉我,tell me
这是什么顺序???
广度???
深度???
其实都不是,这是一个叫C3算法来计算继承顺序的
不打算说,因为我也不会
所以你要是想研究
你就去难为百度去,行不?
那我就想知道继承顺序怎么办??
好说,程序员都给你写出来方法了
print(F.__mro__) # 打印类的继承顺序
你打印出来的就是继承顺序!
(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B2'>, <class '__main__.C2'>, <class 'object'>)
都有方法了,你还自己找???
那你可真是个小机灵!
其实这都是很极端的
真正写的哪有这么继承的?
顶多就写到shijie那种就可以了
写成这样的
不是天才,就是疯子!