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は、次の手順を実行します。
- コール__getattribute__
- プロパティの年齢が見つからない場合は、呼び出し__getattribute__ははAttributeError __getattr__スロー
- あなたが年齢を見つけることができれば、それが__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