Python-保護、継承、マルチステート

5986 ワード

1.7. 保護、継承、マルチステート
1.プライベート・オブジェクトと属性:
  • Pythonには、C++のpublicやprivateのようなキーワードがなく、公有およびプライベート属性メソッド
  • を定義しています.
  • 属性名で区別する方法であり、属性名の前に2つのスライド線__を加えるとプライベート属性であることを示すが、そうでない場合は公有属性であり、方法も同様の
  • である.
    例:
    class Msg:
    def __init__(self,money):
        #     
        self.__money=money
    def getMoney(self):
        return self.__money
    #    
    def __sendMsg(self):
        print("---      --")
    def sendMsg(self):
        if(self.getMoney()>100):
            self.__sendMsg()
        else:
            print("    ")
    
    msg=Msg(1000)
    print(msg.getMoney())
    msg.sendMsg()
    

    結果:1000
    --- --
    2.__del()__方法
    オブジェクトを作成すると、python解釈器はinit()メソッドをデフォルトで呼び出します.
    オブジェクトを削除するとpython解釈器もデフォルトでdel()メソッドとしてメソッドを呼び出します.
  • オブジェクトの参照を1つの変数で保存すると、そのオブジェクトの参照カウントに1
  • が加算されます.
  • delを使用して変数が指すオブジェクトを削除する場合、オブジェクトの参照カウントが1、例えば3でない場合、この参照カウントは1だけ減算され、2になります.delを再度呼び出すと、1になります.delをもう一度呼び出すと、本当に
  • になります.
    例1では、1つを削除し、1つを残します.
    class Dog:
        def __del__(self):
            print("over")
    
    dog=Dog()
    dog1=dog
    del dog
    print("=======")
    

    結果は次のとおりです.
    =======
    over
    

    例2、削除済み:
    class Dog:
        def __del__(self):
            print("over")
    
    dog=Dog()
    dog1=dog
    del dog
    del dog1
    print("=======")
    

    結果は次のとおりです.
    over
    =======
    

    測定オブジェクト参照個数
    sysモジュールを導入しsysを使用する必要がある.getrefcount(オブジェクト)は、呼び出し時にパラメータが渡され、1つ増えたため、測定された個数が実際の個数より1つ多い.
    import sys
    class Dog:
        def __del__(self):
            print("over")
    
    dog=Dog()
    dog1=dog
    print(sys.getrefcount(dog))
    del dog
    print(sys.getrefcount(dog1))
    del dog1
    print(sys.getrefcount(dog1))
    

    結果は次のとおりです.
    3
    2
    over
    Traceback (most recent call last):
      File "/home/shushu/PycharmProjects/pylearn35/del  .py", line 12, in 
        print(sys.getrefcount(dog1))
    NameError: name 'dog1' is not defined
    

    最後の行の検査の時すでになくなって、だから間違いを報告することができます
    3.継承
    例:
    #       ,  :
    class Cat(object):
    
        def __init__(self, name, color="  "):
            self.name = name
            self.color = color
    
        def run(self):
            print("%s--  "%self.name)
    
    
    #       ,  Cat   :
    class Bosi(Cat):
    
        def setNewName(self, newName):
            self.name = newName
    
        def eat(self):
            print("%s--  "%self.name)
    
    
    bs = Bosi("   ")
    print('bs    :%s'%bs.name)
    print('bs    :%s'%bs.color)
    bs.eat()
    bs.setNewName('  ')
    bs.run()
    

    結果は次のとおりです.
    bs    :   
    bs    :  
       --  
      --  
    
  • サブクラスは、親の__init__メソッド
  • をデフォルトで実行することができる.
  • 子クラス継承時、クラスを定義する際、カッコ()は親クラスの名前
  • となる.
  • 親の属性とメソッドは、子
  • に継承されます.
    注意*プライベート属性は、オブジェクトを介して直接アクセスすることはできませんが、メソッドを介して*プライベートメソッドにアクセスできます.オブジェクトを介して*プライベート属性、メソッドに直接アクセスできません.クラスに継承されたり、アクセスされたりすることはできません.親のみがプライベート属性とメソッドにアクセスするメソッドを提供します.サブクラスは、このメソッドを介してプライベート属性とメソッドにアクセスします*一般的には、私有の属性、方法はすべて対外的に公表しないので、往々にして内部の事をして、安全な作用を果たすことができます
    書き換える
    書き換えとは、子クラスに親と同じ名前のメソッドがあり、子クラスのメソッドは親クラスの同じ名前のメソッドを上書きします.
    親を呼び出す方法:
    class Cat(object):
        def sayHello(self):
            print("halou-----1")
    
    
    class Bosi(Cat):
    
        def sayHello(self):
            print("halou-----2")
            #          
            Cat.sayHello(self)
            #          
            super().sayHello()
    
    a=Bosi();
    a.sayHello()
    

    結果は次のとおりです.
    halou-----2
    halou-----1
    halou-----1
    

    4.マルチ継承
    マルチ継承の場合、同じメソッド呼び出し順序は .__mro__で表示できます.
    class base(object):
        def test(self):
            print('----base test----')
    class A(base):
        def test(self):
            print('----A test----')
    
    #       
    class B(base):
        def test(self):
            print('----B test----')
    
    #       ,   A、B
    class C(A,B):
        pass
    
    
    obj_C = C()
    obj_C.test()
    
    print(C.__mro__) #    C              
    

    結果は次のとおりです.
    ----A test----
    (, , , , )
    

    5.マルチステート
    class Dog(object):
        def print_self(self):
            print("Dog")
    
    class Xiaotq(Dog):
        def print_self(self):
            print("Xiaotq")
    
    def introduce(temp):
        temp.print_self()
    
    dog=Dog()
    xiaotq=Xiaotq()
    introduce(dog)
    introduce(xiaotq)
    

    6.クラス属性、インスタンス属性
    class Dog(object):
        age=0
        __name="tom"
    
        def __init__(self,color):
           self.color=color
    dog=Dog(" ")
    print(dog.age)
    print(Dog.age)
    # print(Dog.__name)         
    print(dog.color)
    print("---------------------")
    
    dog.age=1#           
    print(dog.age)#            
    print(Dog.age)#               
    print("---------------------")
    
    Dog.age=1#          ,        
    print(dog.age)
    print(Dog.age)
    print("---------------------")
    
    del dog.age
    print(dog.age)
    print(Dog.age)
    

    結果は次のとおりです.
    0
    0
     
    ---------------------
    1
    0
    ---------------------
    1
    1
    ---------------------
    1
    1
    

    7.クラスメソッド、静的メソッド、
    class Dog(object):
        age=0
        __name="tom"
    
        def __init__(self,color):
           self.color=color
    
        #             ,      @classmethod        ,     ,           ,   cls       
        @classmethod
        def addAge(cls):
            cls.age+=10
    
        #           @staticmethod     ,            
        @staticmethod
        def msg():
            print("+---------+")
            print("|   Dog   |")
            print("+---------+")
    
    dog=Dog(" ")
    Dog.msg()
    dog.msg()
    print("------------------------")
    
    dog.addAge()
    print(dog.age)
    print(Dog.age)
    print("------------------------")
    
    Dog.addAge()
    print(dog.age)
    print(Dog.age)
    

    結果は次のとおりです.
    +---------+
    |   Dog   |
    +---------+
    +---------+
    |   Dog   |
    +---------+
    ------------------------
    10
    10
    ------------------------
    20
    20