~~コアプログラミング(E):オブジェクト指向 - 多重継承~~

进击の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那种就可以了

    写成这样的

    不是天才,就是疯子!


*三大特性之一*
*你不会能行吗*

おすすめ

転載: www.cnblogs.com/jevious/p/11200457.html