序文
今日では@propertyのビルトインされた装飾のpython、主な役割は、クラスのメソッドの属性がクラスになっているデコレータ、およびプロパティの定義については、既存のプロパティが容易になる変更であります
私たちは、与えられたソースコードの例と解説を見ることができます@property
1つのデコレータは、新しいプロパティを定義するか、簡単に既存のものを修正する: 2 3 4 クラスC(オブジェクト): 5 @property 6 DEF X(自己): 7 " 私は'X'プロパティ午前" 8 戻りself._x 9 10 @ x.setter 11の デフX(自己、値): 12 self._x = 値 13 14 x.deleter @ 15 デフX(自己): 16 デル self._x
はい、tは説明を与える亀はデコレータは、新しいプロパティを定義し、既存のプロパティがよりシンプルになり、より少ない伝統的なアプローチは、結合特性は、プロパティにアクセスするものと行うことです修正するということですか?
例
。1 "" " 2 ------------------------------------ 3。 @time:2019年7月4日20時57 4 @Auth:Linuxの超 5 @file:python_property.py 6 @IDE:PyCharm 7 @Motto:!レアル戦士、Incisiveのエラーで直面してみろ、ブリーク警告に直面してみろ 8 QQ @:28174043 QQ @。 COM 9。 @GROUP:878565760 10 ------------------------------------ 。11 "" " 12は 13であり、 14 クラスのUserInfo(オブジェクト): 15 16 DEFのget_name(自己): 17 「」「クラスプロパティでクラスにアクセスする方法によって」「」 18 返す。自己__name__を 19。 20 DEFのSET_NAME(セルフ、名): 21は " "" 外部パラメータ渡しモード属性によって結合""" 22である 。自己__name__ = 名 23である 24 25 IF __name__ == ' __main__ ' : 26であり、 ユーザー= UserInfo() 27 #のバインド名属性 28 user.set_name([ " スーパー兄弟"、 "Linuxのスーパー"] ) 29 印刷("私の名前は:"、user.get_name())
結果
私の名前は次のとおりです。[「ウルトラ兄弟」、「Linuxのスーパー」]
終了コード0で仕上げプロセス
プロパティをバインドするときに、この方法では、得られた性質は非常に面倒で、データの正確性を保証することはできません、ビューの結果から、名前は魚の文字列でなければなりませんが、出力はリストであり、従いません実際のルール
そして、プロパティに直接アクセスはとても直感的にプロパティを変更し、存在しません
私たちは、達成するために、コードにいくつかの変更を行い、@propertyデコレータを使用します
1 ""」 2 ------------------------------------ 3 @time:2019年7月4日22時02分 4 @Auth:linuxの超 5 @file:python_class.py 6 @IDE:PyCharm 7 @Motto:レアル戦士、鋭いエラーに直面する勇気、荒涼とした警告に直面する勇気! 8 @QQ:QQ @ 28174043を。 COM 9 @GROUP:878565760 10 ------------------------------------ 11 ""」 12 13 14 クラスのUserInfo(オブジェクト): 15 @property 16 デフ名(自己): 17 リターン自己。__名 18 19 name.setter @ 20 デフ名(自己、名): 21 場合でisinstance(名前、STR): 22 自己。__name = 名前 23 他: 24 昇給の例外TypeError(" 名前はstrのでなければならない" ) 25 26 27 もし __name__ == ' __main__ ' : 28 ユーザー= のUserInfo() 29 #绑定属性 30 user.name = " Linuxの超" 31 印刷(" 私の名前はある" 、user.name) 32 user.name = [ " のLinuxスーパー"、" スーパー兄弟" ] 33 印刷(" 私の名前はある"、user.name)
結果
我的名字是Linuxの超 トレースバック(最新のコールの最後): ファイル" D:/LingMengPython16/LingMengPython16/cnblogs/python_class.py "、ライン32 内の <モジュール> user.name = " Linuxの超"、" 超哥「】 ファイル」/LingMengPython16/LingMengPython16/cnblogs/python_class.py:D 「ライン24 内の名前 上げ(例外TypeError 」名前がSTRでなければならない」) 名前がSTRでなければならない:例外TypeError 終了コードで仕上げプロセス 1
文字列型は、それがエラーになるときに、プロパティがバインドされていない場合の後に最適化されたコードは、我々が見ることができる、と私たちは直接、プロパティへのアクセスをプロパティにアクセスするには、同様の方法をバインドする属性することができますので、より直感的に
ここでは彼の非常に変更されているメソッド名と@propertyの名前にname.setter名は、メソッド名を変更@注目すべき点は、ある一貫していなければならない、そうでない場合はエラーになります
@使用@propertyデコレータによるものですName.setterの装飾は、後で彼自身を作成しました
実際に、私は@perproty装飾は、クラス外でのプライベートメンバーのプロパティにアクセスするために使用することができますプロパティへのプロパティやアクセスをバインドするために使用されるだけではなく、唯一んだと思います
まず、外部のクラスの例でプライベートメンバーへの直接アクセスを見て
1 ""」 2 ------------------------------------ 3 @time:2019年7月4日20:57 4 @Auth:linuxの超 5 @file:python_property.py 6 @IDE:PyCharm 7 @Motto:レアル戦士、鋭いエラーに直面する勇気、荒涼とした警告に直面する勇気! 8 @QQ:QQ @ 28174043を。 COM 9 @GROUP:878565760 10 ------------------------------------ 11 ""」 12 13 14 クラスのUserInfo(オブジェクト): 15 16 デフ __init__ (自己、名前、年齢): 17 自己。__名= 名前 18 の自己を。__age = 年齢 19 20 なら __name__ == ' __main__ ' : 21 ユーザーのUserInfo =(' Linuxの超'、18 )、 22 プリント(ユーザ__name)
結果
トレースバック(最新の呼び出しの最後): ファイル" D:/LingMengPython16/LingMengPython16/cnblogs/python_property.py "、22行、で、<モジュール> プリント(ユーザー。__name ) はAttributeErrorは:' のUserInfo 'オブジェクトが属性を持っていない' __name ' プロセス終了コードで終了した 1
はい、プログラムが正常に実行する方法はありません、Pythonはあなたがクラスのプライベートメンバーであるクラスへの外部アクセスを許可していないので、実際には、データのセキュリティを保護するために、そう
だから、今回はクラス@propertyデコレータにアクセスするためにプロパティを使用することができます
1 ""」 2 ------------------------------------ 3 @time:2019年7月4日20時57 4 @Auth:linuxの超 5 @file:python_property.py 6 @IDE:PyCharm 7 @Motto:レアル戦士、鋭いエラーに直面する勇気、荒涼とした警告に直面する勇気! 8 @QQ:QQ @ 28174043を。 COM 9 @GROUP:878565760 10 ------------------------------------ 11 ""」 12 13 14 クラスのUserInfo(オブジェクト): 15 16 DEF __init__ (自己、名): 17 自己。__名= 名前 18がある 19。 @Property 20で DEFの名前(自己): 21がある " "" プライベートクラスのクラス属性へのアクセス方法により、 """ 22が 復帰。自己__NAME__ 23で 24 のIF __name__ == ' __main__ ' : 25 ユーザーのUserInfo =(' Linuxのスーパー' ) 26が 印刷(" 属性名を取得:"、user.name)
結果
name属性を取得します:Linuxのスーパー
終了コード0で終了したプロセス
だから、プロパティのクラスのprivateメンバにアクセスすることができます
だから、実際には、私は、結合特性に関して、あなたは絶対にこの方法を使用することができ、あなたはサブクラスにしたくない場合は、この方法で多く使用サブクラスは親クラスのプロパティを変更防ぐため、親クラスを継承している、と思います避けプロパティが変更され、外側のサブクラスともプライベートプロパティにアクセスすることができます
概要
@propertyデコレータは、プロパティを変更する方法として主に使用され、そして点は注意することが
1.方法は、自己以外の任意の他のパラメータを渡さない装飾で飾られています
2.場合、Xおよび修飾の@ x.setter @propertyメソッド名及びメソッド名は@propertyと@ x.setterを使用するときに一致するように改変することを確認する必要があり、両方の