パッケージ03の内蔵リフレクティブなオブジェクト指向の方法

パッケージ

  1. 大まか:プロパティやメソッドがアップロードされ、あなたはを通して、外部に呼び出すことはできませんクラスの名前を呼び出すために

  2. 狭い:非表示にするプロパティまたはメソッドは、呼び出すことができない、とだけ密かに内部に使用することができます

    名前がプライベートになったとき、二重下線が先行名前を付けます

    class User:
        __country = 'China'
        def __init__(self,name,passwd):
            self.usr = name
            self.__pwd = passwd   # 私有的实例变量/私有的对象属性
        def func(self):
            print(__country)
    alex = User('alex','sbsbsb')
    print(alex.__pwd)     # 报错
    print(alex.pwd)       # 报错
    print(User.__country) # 报错
    alex.func()       # China
    '''
    解析:设置私有的实例变量或私有的对象属性后,无法通过正常的查看属性方法的方式对其查看。
    '''
  3. プライベートインスタンス変数や私有財産を見ます

    プライベートインスタンス変数を取得する方法:プライベートインスタンス変数を得るために、我々は、このメソッドを呼び出すことによって返された値を取得できるように、私たちは、クラスメソッド内の関数の戻り値として、このプライベートインスタンス変数を定義することができます。

    プライベートメソッドを得る方法:我々は、直接この方法では、クラスメソッドの定義の中に返された戻り値として、この民間の方法、**自己.__名()**を実行することができます。

    import  hashlib
    class User:
        def __init__(self,name,passwd):
            self.usr = name
            self.__pwd = passwd   # 私`有的实例变量
        def __get_md5(self):      # 私有的绑定方法
            md5 = hashlib.md5(self.usr.encode('utf-8'))
            md5.update(self.__pwd.encode('utf-8'))
            return md5.hexdigest()
        def getpwd(self):
            return self.__get_md5()
    alex = User('alex','sbsbsb')
    print(alex.getpwd())
    '''
    解析:我们在私有方法__get_md5中针对用户名密码加密,当想在类的外部查看时,可以通过对象名.getpwd()查看加密后的结果.
    
    '''
  4. プライベートの原則:

    私たちは、メモリに保存されている静的変数やメソッドの定義の前に__追加するとプライベート変数での戦いの単語のクラスの現在の名前であるので、我々は外に出て見つけているが、外部民間に定義することはできませんコンセプト。我々は自動的にクラス内で使用する場合やクラス名が前にプライベート変数に綴られている現在の文の変形が完了し、それを操作することができます。

    class Foo(object):
        def __init__(self):
            self.__func()
        def __func(self):
            print('in Foo')
    class Son(Foo):
        def __func(self):
            print('in Son')
    Son()
    '''
    in son
    当前这句话所在的类的名字拼在私有变量前完成变形,即__init__所在的类Foo,所以执行的是Foo中的__func
    '''

    注意:独自のコンテンツは、サブクラスで使用することはできません!

    class Foo(object):
        def __func(self):
            print('in Foo')
    class Son(Foo):
        def __init__(self):
            self.__func()
    Son()
    '''
    报错
    因为在Son空间中没有__func。(只在本类的空间)
    '''
  5. 在其他语言中的数据的级别都有哪些?在python中有哪些?
    public  公有的 类内类外都能用,父类子类都能用         python支持
    protect 保护的 类内能用,父类子类都能用,类外不能用    python不支持
    private 私有的 本类的类内部能用,其他地方都不能用     python支持
    • 独自の3例を使用して

      あなたが変更を行う見てみましょう

      変更することはできませんを参照してください(クラスの内部実装)

      変更することができます(クラスの内部実装)を参照してくださいするには

    • パッケージの構文

      プライベート静的変数

      プライベートインスタンス変数

      独自の結合方法

    • 独自の機能

      クラス内で使用することができます

      あなたはクラスの外で使用することはできません

      クラスのサブクラスで使用することはできません。

    • 原則

      変形:完全変形プライベート変数の前の戦いの単語のクラスの現在の名前

      クラス定義の内側に変形した場合

    • レベルのクラス変数

      Pythonのサポートの合計

      pythonをサポートしていない保護

      プライベートサポートパイソン

  6. クラス3つのデコレータ(組み込み関数)

    1. プロパティ

      1. 例えばプロパティとして偽装方法(パラメータなし)へ:
          from math import pi
          class Circle:
              def __init__(self,r): self.r = r
              @property   # 把一个方法伪装成一个属性,在调用这个方法的时候不需要加()就可以直接得到返回值
              def area(self): return pi * self.r**2
          c1 = Circle(5)
          print(c1.r)
          print(c1.area)
      
          '''
          解析:@property把一个方法伪装成一个属性,在调用这个方法的时候不需要加()就可以直接得到返回值
          如上式中我们想查看c1的面积只需要c1.area就可,省略了()
        '''
      1. 2番目のシナリオ:協同組合と私有財産

        class Goods:
            discount = 0.8
            def __init__(self,name,origin_price):
                self.name = name
                self.__price = origin_price
            @property
            def price(self):
                return self.__price * self.discount
        apple = Goods('apple',5)
        print(apple.price)     # 4.0
      2. アドバンスト - 私有財産への変更

        class Goods:
            discount = 0.8
            def __init__(self,name,origin_price):
                self.name = name
                self.__price = origin_price
            @property
            def price(self):
                return self.__price * self.discount
        
            @price.setter          # 装饰器
            def price(self,new_value):
                if isinstance(new_value,int):
                    self.__price = new_value
        
            @price.deleter
            def price(self):
                del self.__price
        
        apple = Goods('apple',5)
        print(apple.price)   # 调用的是被@property装饰的price
        apple.price = 10     # 调用的是被setter装饰的price
        print(apple.price)
        
        del apple.price        # 调用的是被deleter装饰的prcie (并不能真正删除什么,而是调用此方法,此方法内部有删除price的代码而已。
        
        '''
        4.0
        8.0
        '''
    2. クラスメソッド - 装飾されたメソッドは、クラスメソッドになります

      1. 処置:オブジェクトをバインドする方法は、クラスのメソッドをに変更します

      2. 利点:

        • この方法では、まだクラスの静的変数を参照することができます
        • あなたは、オブジェクトをインスタンス化することはできません、あなたが直接外部このメソッドを呼び出すために、クラス名を使用します
        • メソッドを呼び出して、クラス名によって、あなたはまた、オブジェクト名でメソッドを呼び出すことができます
      3. ときに使用するには:

        • それは自己を着用する方法、デフォルトを定義しますが、自己が使用されていません
        • そして、あなたは現在のクラス名で、このメソッドを使用するか、時間の名前にメモリ空間のこの種を使用しようとしています
        class Goods:
            __discount = 0.8
            def __init__(self):
                self.__price = 5
                self.price = self.__price * self.__discount
            @classmethod   # 把一个对象绑定的方法 修改成一个 类方法
            def change_discount(cls,new_discount):
                cls.__discount = new_discount
        
        Goods.change_discount(0.6)   # 类方法可以通过类名调用
        apple = Goods()
        print(apple.price)
        apple.change_discount(0.5)  # 类方法可以通过对象名调用
        apple2 = Goods()
        print(apple2.price)
        
        '''
        3.0
        2.5
        '''
      4. いくつかの理解の例!

        import time
        class A:
            def __init__(self,year,month,day):
                self.year = year
                self.month = month
                self.day = day
            @classmethod
            def today(cls):
                year = time.localtime().tm_year
                month = time.localtime().tm_mon
                day = time.localtime().tm_mday
                return cls(year,month,day)
        t_day = A.today()
        print(t_day.year,t_day.month,t_day.day)
        # 2019 6 5
    3. staticmethod - 添え方法は、静的メソッドになります

      1. 効果:直接移動使用するクラスの一般的な機能、静的の製造方法

      2. 使用するとき:自身で正常な機能、あなたがに移動したいクラスの内部実装され、それにこの機能@staticmethodデコレータに直接追加。

      3. 両方の自己変数の関数の内部で使用されることはありません、それはCLSクラスを使用できません。

        class User:
            pass
            @staticmethod
            def login(a,b):      # 本身是一个普通的函数,被挪到类的内部执行,那么直接给这个函数添加@staticmethod装饰器就可以了
                print('登录的逻辑',a,b)
                # 在函数的内部既不会用到self变量,也不会用到cls类
        obj = User()
        User.login(1,2)
        obj.login(3,4)
        '''
        登录的逻辑 1 2
        登录的逻辑 3 4
        '''
      4. あなたは、コンテンツのクラスを定義することができます。

      class A:
          country = '中国'
          def func(self):
              print(self.__dict__)
          @classmethod
          def clas_func(cls):
              print(cls)
          @staticmethod
          def stat_func():
              print('普通函数')
          @property
          def name(self):
              return 'wahaha'
      • 静的変数は、 - オブジェクト/クラスによって呼び出される変数内のすべてのオブジェクトによって共有されています。

      • バウンド方法 - オブジェクトによって呼び出さ自己引数が付属して機能

      • クラスメソッド - CLSパラメータは、オブジェクト/クラスから来ているの関数呼び出しであります

      • 静的メソッドを - オブジェクト/クラスの呼び出しによって何もない普通の関数であります

      • プロパティプロパティ:プロパティメソッドは、オブジェクトで変装ではなく呼ばれているブラケット

  7. 反射(GETATTR()はhasattr())
    1. 定義:文字列データ型名、\インスタンス変数を操作する関数は、名前に対応するようにする方法と結合\します

    2. ときに使用する:あなたが直接彼に電話したいの名前は、変数、文字列データ型を知っていますが、調整することはできません

      シナリオ:

      • オブジェクトのインスタンス変数を反映
      • 静的クラス変数反射/結合方法/他の方法
      • すべての変数をモジュール
        • モジュールの導入モジュール
        • 現在実行PYファイル - スクリプト
    3. 例えば:

      1. このスクリプトクラス反射法やインスタンス変数
          class Person:
              def __init__(self,name,age):
                  self.name = name
                  self.age = age
              def qqxing(self):
                  print('in qqxing')
      
          alex = Person('alex',83)
          wusir = Person('wusir',74)
          ret = getattr(alex,'name')
          print(ret)                        # alex
          ret = getattr(wusir,'qqxing') # in qqxing
          ret()
      
          '''
          解析:我们创建一个类alex,当我查看alex中的变量及方法须使用alex.想查看的内容
          但如果查看的内容如果是一个待输入的即字符串类型,我们无法执行。
          此时,我们可以使用getattr(alex,想查看的内容) 《=》alex.想查看的内容(去除字符串格式后)
      
          '''
      1. インポートされたモジュールクラスに反映

        import a 
        print(getattr(a, 'Alipay'))
        print(getattr(a, 'Wechat'))
        # 导入模块a中的类的内存地址,可以在其后加()按照格式创建对象
      2. 現在のスクリプトの反射でなど、クラス、関数名、変数、

        import sys
        s1 = '加油老哥们!'
        class Person:
            def __init__(self,name,age):
                self.name = name
                self.age = age
        
        print(getattr(sys.modules['__main__'],'s1'))
        ret = getattr(sys.modules['__main__'],'Person')
        nie = ret('alex',18)
        print(nie.__dict__)
    4. Hsattr()

      • 我々はGETATTR()を使用する場合、エラーが検出されませんので、使用前に、まず私たちが対応するメソッドや変数が存在するために探しているかを決定する必要があります。

      • 後、またはなし)呼び出し可能な我々は、操作の内容を入力することではなく、それに対応するメソッド、関数、または変数を知らないので、我々はそれを呼び出すことができるかどうかを判断する必要があり、この時間は、(増加して呼び出すことができますしたいとき

        class A:
            Role = '治疗'
            def __init__(self):
                self.name = 'alex'
                self.age = 84
            def func(self):
                print('wahaha')
        
        a = A()
        print(hasattr(a,'sex'))     # False
        print(hasattr(a,'age'))     # True
        print(hasattr(a,'func'))    # True
        if hasattr(a,'func'): ————》此时为True
            if callable(getattr(a,'func')):  ————》func为方法,可调用
                getattr(a,'func')() ————》 所以调用func
        1. いくつかの組み込みのマジックメソッド
    5. __new__(コンストラクタ)
      1. 役割:空間オブジェクトを作成が必要とされています

      2. > -オブジェクト・スペースを作成するためにインスタンス化では、クラスのカテゴリへのポインタがあり__new__呼び出す前に__init__

        class A:
            def __new__(cls, *args, **kwargs):   # 构造方法
                # o = super().__new__(cls)
                o = object.__new__(cls)        # 寻找父类中__new__方法并创建一个class A的对象
                print('执行new',o)
                return o                   # 返回在父类中得到的对象
            def __init__(self):        # __init__接收到__new__返回的对象给予self
                print('执行init',self) 
        A()
        
        '''
        解析:当我们实例化A时,总是先执行__new__方法,而方法中的内容为寻找并执行父类(object类)的__new__方法,把返回的对象赋予给__Init__的self并执行__init__的函数。
        '''
      3. デザインパターン - シングルケースモデル(開始から終了までのクラスが自己のスペースを作成します)

        \class A:
            __statu = None
            def __new__(cls, *args, **kwargs):
                if not cls.__statu:
                    cls.__statu = super().__new__(cls)
                return cls.__statu
            def __init__(self,name,age):
                self.name = name
                self.age = age
        person = A('NIE',18)
        print(person.name,person.age)  # NIE 18
        person2 = A('sui',18)
        print(person.name,person.age)  # sui 18
        print(person2.name,person2.age)    # sui 18
        
        '''
        解析:类中设置了一个私有的静态变量 __statu = None,在进行实例化时先执行A类中的__new__方法,判断__statu是否为空如果为空,则寻找并执行父类的__new__方法,开辟了一个空间,创建了一个A类的对象,并重新赋值给 __statu,当再次实例化时__statu已被赋值,所以不会重新开辟空间创建对象。所以所有A类的对象都使用同一个空间。
        
        '''

        インポートはPythonのシングルトンで導入されています

    6. __call__

      オブジェクトが判定した場合()オブジェクトの内部で実行される呼び出し可能な(オブジェクト)を使用して実行可能である__call__方法。

    7. __len__

      オブジェクトの長さを取得します。LEN(オブジェクト)を使用する場合、オブジェクト内で実行される__len__方法

      class Cls:
          def __init__(self,name):
              self.name = name
              self.students = []
          def len(self):                
              return len(self.students)
          def __len__(self):
              return len(self.students)
      py22 = Cls('py22')
      py22.students.append('杜相玺')
      py22.students.append('庄博')
      py22.students.append('大壮')
      print(py22.len())     # 3  调用类的绑定方法
      print(len(py22))      # 3  调用内置函数
    8. __str____repr__

      1. 役割:明示的な表示のための両方の目的は、簡単に表示およびデバッグに必要な情報をオブジェクト。

      2. 使用シナリオ:私は、オブジェクトに関するいくつかの情報を取得したいオブジェクトを印刷したいです。ダイレクトプリントは、この時点で完了することができません。

      3. 注意:

        • ステッチまたはSTR(オブジェクト)と印刷対象の印刷()%sの文字列だけは、常にこのオブジェクトを呼び出す__str__メソッドを
        • __str__情報がスプライスされる必要がある場合にのみ、文字列、リターンの複数を返します。

        以下の例:. ''([self.name、STR(self.price)、self.period])に参加

        class Course:
            def __init__(self,name,price,period):
                self.name = name
                self.price = price
                self.period = period
            def __str__(self):
                return ','.join([self.name,str(self.price),self.period])   # 字符串拼接
        python = Course('python',21800,'6 months')
        linux = Course('linux',19800,'5 months')
        mysql = Course('mysql',12800,'3 months')
        go = Course('go',15800,'4 months')
        print(go)          # go,15800,4 months 
        print(python)      # python,21800,6 months
        print(mysql)       # mysql,12800,3 months
        lst = [python, linux, mysql, go]
        for index,c in enumerate(lst,1):
            print(index,c)
        num = int(input('>>>'))
        course = lst[num-1]
        print('恭喜您选择的课程为 %s  价格%s元'%(course.name,course.price))
        
      4. __repr__

        __repr__不仅是__str__的替代品,还有自己的功能
        用%r进行字符串拼接 或者用repr(对象)的时候总是调用这个对象的__repr__方法
        class clas:
            def __init__(self):
                self.student = []
            def append(self,name):
                self.student.append(name)
            def __repr__(self):
                return str(self.student)
            def __str__(self):
                return 'aaa'
        py22 = clas()
        py22.append('大壮')
        print(py22)                # aaa 执行__str__
        print(str(py22))       # aaa 执行__str__
        print('我们py22班 %s'%py22)   # 我们py22班 aaa   执行__str__
        print('我们py22班 %r'%py22)   # 我们py22班 ['大壮']
        print(repr(py22))      # ['大壮']

おすすめ

転載: www.cnblogs.com/lianzibing/p/10993705.html