PythonはDay 08の特殊な属性と特殊な方法を学びます

22135 ワード

特殊な属性と特殊な方法
(一)特殊属性
  • __dict__メソッド:クラスオブジェクトまたはインスタンスオブジェクトにバインドされたすべてのプロパティとメソッドを取得する辞書
  • class A:
        pass
    class B:
        pass
    class C(A,B):
        def __init__(self,name,age):
            self.name=name
            self.age=age
    #  C    
    c=C('Jack',23)
    print(c.__dict__) #       
    print(C.__dict__)  #      
    
    print('-------------------------------------------')
    print(c.__class__) #        
    print(C.__bases__) #C         
    print(C.__base__)
    print(C.__mro__) #      
    print(A.__subclasses__())
    

    (二)特殊な方法
  • 1.len()メソッド:書き換える_len__()メソッドは、内蔵関数len()のパラメータをカスタムタイプ
  • とすることができる.
  • 2.add()メソッド:書き換え_によりadd__()メソッドでは、カスタムオブジェクトに「+」機能
  • を持たせることができます.
  • 3.新()メソッド:オブジェクト
  • を作成する
  • 4.Init()メソッド:作成オブジェクトの初期化
  • a=20
    b=45
    c=a+b  #            
    d=a.__add__(b) #65
    
    print(c) #65
    print(d) #65
    
    class Student:
        def __init__(self,name): #    
            self.name=name
        def __add__(self, other): #      __add__()return self.name+other.name
    
    #      
    stu1=Student('  ')
    stu2=Student('  ')
    s=stu1+stu2
    #print(stu1+stu2) #  ,        
    print(s) #    
    s=stu1.__add__(stu2) #   stu1+stu2
    print(s) #    
    
    class Student:
        def __init__(self,name): #    
            self.name=name
        def __add__(self, other): #      __add__()return self.name+other.name
        def __len__(self,name):
            return len(self.name) #      __len__()  ,           
    
    lst=[12,34,56,24]
    print(len(lst)) #   4len()print(lst.__len__()) #4
    print(len(stu1.name)) #      __len__()     :object of type 'Student' has no len()
                          #   ‘  ’     2
    
    class Person:
        def __init__(self, name, age):
            print('__init__      ,self id  {0}'.format(id(self)))
            self.name = name
            self.age = age
        def __new__(cls, *args, **kwargs):
            print('__new__      ,cls id  {0}'.format(id(cls)))
            obj=super().__new__(cls)
            print('     id {0}'.format(id(obj)))
            return obj
    
    
    print('object      id :{0}'.format(id(object)))
    print('Person      id {0}'.format(id(Person)))
    
    #  Person      
    p1=Person('  ',24)
    print('p1  Person       id :{0}'.format(id(p1)))
    
    object      id :1700574656
    Person      id 2653101470232
    __new__      ,cls id  2653101470232
         id 2653133666736
    __init__      ,self id  2653133666736
    p1  Person       id :2653133666736
    

    二、クラスの付与とコピー
  • 1.変数の付与操作:2つの変数を形成するだけで、実際には同じオブジェクト
  • を実行する.
  • 2.浅いコピー:Pythonコピーは一般的に浅いコピーであり、コピー時にオブジェクトに含まれるサブオブジェクトの内容はコピーされません.したがって、ソースオブジェクトとコピーオブジェクトは、同じオブジェクト
  • を参照する.
  • 3.深度コピー:copyモジュールのdeepcopy()関数を使用して、再帰コピーオブジェクトに含まれるサブオブジェクトを再帰コピーします.ソースオブジェクトとコピーオブジェクトのすべてのサブオブジェクトも異なります.
    class CPU:
        pass
    class Disk:
        pass
    class Computer:
        def __init__(self,cpu,disk):
            self.cpu=cpu
            self.disk=disk
    
    #(1)     
    cpu1=CPU()
    cpu2=cpu1
    print(cpu1)
    print(cpu2)
    
    #(2print('-------------------------')
    disk=Disk() #          
    computer=Computer(cpu1,disk) #           
    
    #   
    import copy
    computer2=copy.copy(computer)
    print(computer,computer.cpu,computer.disk)
    print(computer2,computer2.cpu,computer2.disk)
    
    print('------------------------------')
    #   
    computer3=copy.deepcopy(computer2)
    print(computer2,computer2.cpu,computer2.disk)
    print(computer3,computer3.cpu,computer3.disk)
    
    <__main__.CPU object at 0x000001979060FF98>
    <__main__.CPU object at 0x000001979060FF98>
    -------------------------
    <__main__.Computer object at 0x0000019790618080> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
    <__main__.Computer object at 0x0000019790618128> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
    ------------------------------
    <__main__.Computer object at 0x0000019790618128> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
    <__main__.Computer object at 0x0000019790618160> <__main__.CPU object at 0x0000019790618710> <__main__.Disk object at 0x0000019790626F60>
    
    Process finished with exit code 0