1

笑わないでください。私は必死です。

getter と setter を使用した Python クラスの標準的な例を次に示します ( Wikipediaから)。

class Student(object):
    # Initializer
    def __init__(self, name):
        # An instance variable to hold the student's name
        self._name = name

    # Getter method
    @property
    def name(self):
        return self._name

    # Setter method
    @name.setter
    def name(self, new_name):
        self._name = new_name

今、デコレータなしの私のバージョン:

class Student(object):
    # Initializer
    def __init__(self, name):
        # An instance variable to hold the student's name
        self._name = name

    # Getter method
    def name(self):
        return self._name
    name=property(fget=name)

    # Setter method
    def set_name(self, new_name):
        self._name = new_name
    name = property(fset=set_name)

... 2番目のバージョンが機能しないことを除いて。Student クラスをインスタンス化すると、たとえばBob=Student('Bob')、Bob.name は AttributeError:unreadable 属性をスローします。

私の評判が10,000に達したらすぐに、反対票が殺到し始める前にバグを指摘するために身をかがめる親切な魂に100ポイントを寄付することを約束します.

4

2 に答える 2

5

ゲッターにも名前を付ける必要があります。

name = property(fget=name, fset=set_name)

または単に

name = property(name, set_name)

propertyドキュメントを参照してください。

デコレータの@構文は単なる構文糖衣です。次の形式:

@decorator_expression
def function_name(...):
    ...

次のように実行されます。

def function_name(...):
    ...
function_name = decorator_expression(function_name)

decorator_expression関数が最初の引数として渡されることで、パーツが呼び出し可能なものとしてどのように扱われるかに注意してください。その点では、 Aproperty()も同じです。

の最初のプロパティが定義されるとname、クラスの名前空間に新しいオブジェクト オブジェクトが作成されます。そのオブジェクトにはメソッドがあり、渡された新しい関数に置き換えられたセッターでプロパティを返すだけです。nameproperty.setter()

したがって、この構文では既存のインスタンス@name.setterのメソッドが呼び出され、そのメソッドはセッターが置き換えられたプロパティを返します。.setter()property

したがって、明示的なプロパティ作成者を次のように綴ることもできます。

name = property(name)
name = name.setter(set_name)

あなたのバージョンは、name(getter で定義された) プロパティを単に setter のみを定義するものに置き換えただけであり、2 つにはそれ以外の関係はありません。

于 2013-05-07T21:23:44.937 に答える
0

ゲッターとセッターは、実際に何かをしていない限り、python では意味がありません。

class kid:
    def __init__(self,name):
        self.name = name


>>>bill = kid('bill')
>>>bill.name = 'johnny' #is good enough
>>>bill.name
johnny
>>>bill.job = 'student'
>>>bill.job
student
于 2013-05-07T21:24:53.833 に答える