第VIII章メタクラスプログラミングパイソン

1.property動的特性

  一般的な単一又は二重下線下線を使用してオブジェクトのプロパティ擬似プライベートタイプである、(保護された形で表される)最初に、単一の下線属性が直接オブジェクトを介してアクセスすることができる、及びビス開始性下降線は(タイププライベート示す)でなければなりません__ .__クラスのプライベートプロパティ名にアクセスするには、オブジェクト名を使用して

1  クラス試験:
 2      DEF  __init__ (自己):
 3          自己。__t1 = " T1 " 
4          self._t2 = " T2 " 
5  
6  
7試験= 試験()
 8  プリント(test._Test__t1、test._t2)  T1 T2 
9  
10 test._Test__t1 = " Test_t1 " 
11 test._t2 = " Test_t2 
12  プリント(test._Test__t1、test._t2)  Test_t1 Test_t2

  私たちは、プログラムをよりエレガントにするために、我々は@propertyデコレータ関数はオブジェクトのプロパティになりましょうしている、我々は関数呼び出しを使用する必要があり、擬似民間譲渡やその他の操作のタイプではない合意を順守する必要があります

  • @property:デフォルトのオブジェクトのプロパティとして設定年齢を非表示__age、および通常のプロパティのようなセット年齢、user.ageを使用して得られた値
  • 通常のプロパティのような属性の@property修正割り当てセット、割り当てにuser.age = 65の使用:Age.setter @
1  クラスユーザー:
 2      DEF  __init__ (セルフ、名):
 3          self.name = 4          。自己__age = 0
 。5  
。6      通常の関数コール
7      DEFのget_age(自己):
 8          リターン。自己__age 
9。 
10      __age取得します方法
11      @Property
 12は、     DEF 年齢(セルフ):
 13が         リターン自己。__age 
14  
15      組の__age方法
16      age.setter @
 17。     デフ年齢(自己、値):
 18          もし値> 150 または値< 0:
 19              昇給とValueError(' 無効な年齢' 20          セルフ。__age = 21  
22  
23  なら __name__ == " __main__ " 24      ユーザー=ユーザー(" USER1 " 25      = 35 user.age
 26      プリント(user.age)  35 
27  
28      user._User__age = 65
29      プリント(user._User__age、user.age)  65 65 
30      プリント(user.get_age())  65

2 .__ GETATTR __、__ getattribute__魔法機能

  • __getattribute__:アクセスプロパティは、魔法の関数を入力します
  • __getattr:プロパティにアクセスすると、プロパティには、魔法のコールこの機能を見つけるためのアクセス権を持っていません
1  クラスのユーザー:
 2      DEF  __init__(自己、情報= {}):
 3          self.info = インフォメーション
 4  
5      DEF  __getattr__ (自己、項目):
 6          戻りself.info [アイテム]
 7  
8      DEF __getattribute __(自己、項目) :
9           リターン"のgetAttribute" 
10  
11  
12  なら __name__ == " __main__ " 13      ユーザー=ユーザー(情報= { " COMPANY_NAME "" imooc" " 名前"" ボビー" })
 14      プリント(user.name)#1 imooc

3.属性と属性記述子のルックアッププロセス

1.プロパティ記述子が何であるかを
  達成__get __、__ __セット、__任意delete__の方法、指定された属性記述子

2.データ記述子は何ですか

  __get __達成、__ set__二つのクラスメソッド

3.非データディスクリプタとは何ですか

  クラスの__get__方法を実現するための唯一の

プロパティを検索4.

  Userクラスのインスタンスは(TEST_USER、 '年齢')GETATTRするTEST_USER、test_user.ageと同等である場合

Test_user.ageは、次の手順を実行します。

  1. コール__getattribute__
    1. プロパティの年齢が見つからない場合は、呼び出し__getattribute__ははAttributeError __getattr__スロー
    2. あなたが年齢を見つけることができれば、それが__get__と呼ばれています

全体的なプロセスに__Getattribute__:

 1 import numbers
 2 
 3 
 4 class IntField:
 5     # 数据描述符
 6     def __get__(self, instance, owner):
 7         return self.value
 8 
 9     def __set__(self, instance, value):
10         if not isinstance(value, numbers.Integral):
11             raise ValueError("int value need")
12         if value < 0:
13             raise ValueError("positive value need")
14         self.value = value
15 
16     def __delete__(self, instance):
17         pass
18 
19 
20 class NonDataIntField:
21     # 非数据属性描述符
22     def __get__(self, instance, owner):
23         return self.value
24 
25 
26 class User:
27     age = IntField()
28     # age = NonDataIntField()
29 
30 
31 if __name__ == "__main__":
32     test_user = User()
33     test_user.age = 1
34     print(test_user.__dict__, User.__dict__)
35     print(test_user.age)
36     pass
37     pass
38     # print(dir(test_user))
39     # print(test_user.age)

4.__new__和__init__的区别

 

5.自定义元类

 

6.元类实现简单的orm

 

おすすめ

転載: www.cnblogs.com/zhihaospace/p/12094471.html
おすすめ