zoukankan      html  css  js  c++  java
  • Python面向对象——多重继承大揭秘

    1如果如图所示使用多重继承,我们将看到什么

    2我们看到了基类被执行了两次Baseclass

    3代码验证吧

    class BaseClass:
        num_base_calls = 0
        def call_me(self):
            print("Calling method on Based Class")
            self.num_base_calls += 1
        
    class LeftSubclass(BaseClass):
        num_left_calls = 0
        def call_me(self):
            BaseClass.call_me(self)
            print("Calling method on Left Subclass")
            self.num_left_calls += 1
            
    class RightSubclass(BaseClass):
        num_right_calls = 0
        def call_me(self):
            BaseClass.call_me(self)
            print("Calling method on Right Subclass")
            self.num_right_calls += 1
    
    class Subclass(LeftSubclass, RightSubclass):
        num_sub_calls = 0
        def call_me(self):
            LeftSubclass.call_me(self)
            RightSubclass.call_me(self)
            print("Calling method on Subclass")
            self.num_sub_calls += 1
    
    s = Subclass()
    s.call_me() 
    print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)

    4改进措施

    5完美解决=基类执行了一次

    6代码验证

    class BaseClass:
        num_base_calls = 0
        def call_me(self):
            print("Calling method on Based Class")
            self.num_base_calls += 1
        
    class LeftSubclass(BaseClass):
        num_left_calls = 0
        def call_me(self):
            # BaseClass.call_me(self)
            super().call_me()
            print("Calling method on Left Subclass")
            self.num_left_calls += 1
            
    class RightSubclass(BaseClass):
        num_right_calls = 0
        def call_me(self):
            # BaseClass.call_me(self)
            super().call_me()
            print("Calling method on Right Subclass")
            self.num_right_calls += 1
    
    class Subclass(LeftSubclass, RightSubclass):
        num_sub_calls = 0
        def call_me(self):
            # LeftSubclass.call_me(self)
            # RightSubclass.call_me(self)
            super().call_me()
            print("Calling method on Subclass")
            self.num_sub_calls += 1
    
    s = Subclass()
    s.call_me() 
    print(s.num_sub_calls, s.num_left_calls, s.num_right_calls, s.num_base_calls)

    参考:本文参考学习《Python3 Object Oriented Programming》,根据自己理解改编,Dusty Phillips 著

  • 相关阅读:
    洛谷$P4768 [NOI2018]$归程 $kruscal$重构树
    洛谷$P2469 [SDOI2010]$ 星际竞速 网络流
    洛谷$P2572 [SCOI2010]$ 序列操作 线段树/珂朵莉树
    $CF914D Bash and a Tough Math Puzzle$ 线段树
    洛谷$P2824 [HEOI2016/TJOI2016]$ 排序 线段树+二分
    洛谷$P$4137 $Rmq Problem / mex$ 主席树
    bat语法
    zabbix监控oracle
    sqlserver常用命令-4
    sqlserver库相关-表相关-3
  • 原文地址:https://www.cnblogs.com/brightyuxl/p/8836042.html
Copyright © 2011-2022 走看看