2

プロパティを使うのは初めてなので、以下のような簡単なテストをまとめました。私のテストでは、2つのクラス「Test1」と「Test2」を作成しました。それぞれが1つの値を保持することを目的としています。プロパティを使用して、疑似非表示の「val」属性へのアクセスを管理しようとしています。このプログラムは概念実証としてのみ意図されていたため、この現在のテストは「val」属性の入力または出力を制限しません。以下に示す2つのテストクラスは同じ結果をもたらし、プロパティを構築するための異なるメソッドを表すことになっています。私が参照しているプロパティの使用例は、ここのpythonドキュメントにあります

ドキュメントによると:

cがCのインスタンスである場合、cxはgetterを呼び出し、cx = valueはsetterを呼び出し、delcxはdeleterを呼び出します。

ここで、Cはテストクラスです。値を設定することで、_valを変更し、valをプロパティとして残すと思いました。ただし、プロパティセッターにアクセスする私の方法は、5間違っていない限り、実際にはプロパティを整数に置き換えているように見えます。誰かが私の混乱を明らかにしてくれることを願っています。

class Test1:
    def __init__(self):
        self._val = 0

    def setVal(self,newVal):
        self._val = newVal
    val = property(lambda self: self._val, setVal, None, "Property for value")

    def __str__(self):
        return "Value: {}".format(self.val)

class Test2:
    def __init__(self):
        self._val = 0

    @property
    def val(self):
        return self._val

    @val.setter
    def setVal(self,newVal):
        self._val = newVal

    def __str__(self):
        return "Value: {}".format(self.val)

def verify(a):
    print("\nCheck with {}".format(a.__class__.__name__))
    print("Value check:",a.val)
    a.val = 5
    print("Value after a.val = 5 is:",a.val)
    print("The actual value is:",a._val)

def main():
    verify(Test1())
    verify(Test2())

if __name__ == '__main__':
    main()
4

1 に答える 1

4

ドキュメントから:

property([fget[, fset[, fdel[, doc]]]])

新しいスタイルのクラス(オブジェクトから派生したクラス)のプロパティ属性を返します。

記述子は、新しいスタイルのオブジェクトまたはクラスに対してのみ呼び出されます。古いスタイルのクラスを使用しています。基本タイプから継承object

class Test1(object):
    # your code

class Test2(object):
    def __init__(self):
        self._val = 0
    
    @property
    def val(self):
        return self._val
    
    @val.setter
    def val(self,newVal): # should be named as property
        self._val = newVal
    
    def __str__(self):
        return "Value: {}".format(self.val)

これは問題なく動作します:

>>> verify(Test1())

Check with Test1
('Value check:', 0)
('Value after a.val = 5 is:', 5)
('The actual value is:', 5)

新しいスタイルのクラスとクラシックなクラスの違いについてもっと読む。

于 2012-10-17T17:04:07.993 に答える