のオブジェクト指向のPython @property

知人@property

プロパティPythonは組み込みのクラスであるデコレータ。@Propertyのアクションがあり、法呼び出すための属性になります

デコレータ:機能を追加するために、動的機能の本来の機能を変更せず

デコレータの多くの詳細を説明してきた前、性質が達成するPyhton変数(ポインタ)の特性と変数の名前空間の使用への参照です。

def out(func):
    
    def inner(*args, **kwargs):
        
        print(f"...{args[0]} is checking...")
        return func(*args, **kwargs)
    
    return inner


@out
def check_2019_nCov(name):
    msg = f"okay, {name} is very healthy."
    return msg

ret = check_2019_nCov("youge")
print(ret)

# output
...youge is checking...
okay, youge is very health

この@propertyデコレータは、私は通常、コードの最適化、上もう少し使用方法、より良いでしょう読書体験でプロパティパッケージ。特定の実装をかじる、理解していなかった、十分に適用することができるという。

この方法は、使用@propertyトップ飾ら必要であることを具体的な文言のパラメータのみ自己括弧なしで呼び出されました

メソッドは、プロパティを飾られて@property

# 访问类的私有属性
class Foo:
    def __init__(self, score):
        self.__score = score

    @property  # 将方法装饰为属性
    def show_score(self):
        return self.__score


if __name__ == '__main__':
    s = Foo(66)
    # 在写法上更加优雅, 不用多写 "方法()" 没用的括号
    print(s.show_score)

# output:
66

つまり、そのクラスの演劇のメンバーの間で、(クラスのメンバプロパティを示す、外部パラメータのシナリオの下を通過する必要はありません。)、よりPython的にそれを感じを開始します。

ノズルが挿入され、装飾された方法@propertyの実施形態は、の関数であるビューの内部プロパティに外部インターフェイス__スコアは、直接アクセスが望ましい、ことができない、プライベート変数を表すが、依然としてアクセス可能な外部内部変数絶対的なセキュリティああ、行くための正確な十分な場所Pyhtonないと考えることはできない感じ

s = Foo(66)

# 外部直接访问私有变量(方法) 是不可以的

print(s.__score)

# output
AttributeError: 'Foo' object has no attribute '__score'

しかし、によってオブジェクトのクラス名__ ._私有財産のインスタンスことが可能であるように、Aの方法(それは直接Pythonのクラス自体に師事することができる理由構造原理)で

s = Foo(66)

# 没有绝对的安全哦, 只要互相尊重
print(s._Foo__score)

# output
66

@property関連のプロパティ

それはそうプロパティにメソッドを置く以上は何も感じていない上記の文言、スルー。よりシンプルかつエレガントな少し上の書き込みに加えて、どのような具体的な利用シナリオはありますか?

プロパティをバインド - チェック - 手動で行います

class Foo:
    def __init__(self, score):
        self.score = score
     
# 绑定score属性
s = Foo(666)

あなたは、スコアの属性を変更すると、私は通常の書き込み。

s.score = 666

この非常に粗い方法(直接行くためのプロパティを公開する)結合特性、それは書き込みに簡単です、が、しかし何のテストパラメータが存在しないリードができる任意に変更すること

このような残忍な方法は明らかに非常に合理的ではありません。それは、スコアのチェック、値、タイプ、およびそうすることができなければなりません。私たちは財産を獲得し、それが2つ(カスタム)メソッド、達成されるべきであるとget_scoreビューにします値とset_score値を設定します。

class Foo:
    def get_score(self):
        """获取属性值"""
        print(self.score)

    def set_score(self, value):
        """设置属性值"""
        if not isinstance(value, int):
            raise ValueError("score 必须为整数哦")
        if value > 100 or value <= 0:
            raise ValueError("score 必须在 0-100哦")

        self.score = value


if __name__ == '__main__':
    f = Foo()
    # 校验通过是可以的
    f.set_score(66)
    f.get_score()
    
    # output
    66
# 随便设置 score 属性就不可以了. 
if __name__ == '__main__':
    f = Foo()
    f.set_score('youge')
    f.get_score()
    
    # output
        raise ValueError("score 必须为整数哦")
    ValueError: score 必须为整数哦
# 继续 debug
if __name__ == '__main__':
    f = Foo()
    f.set_score('youge')
    f.get_score()
    
    # output
        raise ValueError("score 必须在 0-100哦")
ValueError: score 必须在 0-100哦

バインディングプロパティ - チェック - プロパティ実現@

  • デフォルトは読み取り専用です
  • セッター
  • デリータ
class Foo:

    @property  # read only
    def score(self):
        """获取属性值"""
        return self.score

    @score.setter
    def score(self, value):
        """设置属性值"""
        if not isinstance(value, int):
            raise ValueError("score 必须为整数哦")
        if value > 100 or value <= 0:
            raise ValueError("score 必须在 0-100哦")

        # 这里一定不能 self.socre = value 哦, 不然就递归了.
        self._score = value
        print(f"set score = {value} successfully.")

if __name__ == '__main__':
    f = Foo()
    f.score = 66
    
    # print(f.score)
    # output:
    set score = 66 successfully
    
if __name__ == '__main__':
    f = Foo()
    f.score = 'youge'
    
    # output
        raise ValueError("score 必须为整数哦")
    ValueError: score 必须为整数哦

概要

  • 使用方法@propertyデコレータプロパティなります
  • @propertyのデフォルトは読み取り専用で、セッターと、デリータ...などに使用される、一緒に
  • 一般的なシナリオは、クラスのインスタンスの属性の割り当てである機能をチェックするための値であり、

おすすめ

転載: www.cnblogs.com/chenjieyouge/p/12244456.html