2011-08-01 48 views
2

私はpythonプロパティの純粋なpython実装を探して、初期化の仕組みを理解しています。私は、記述子インターフェイス(になる)を扱っているものの多くは見つけましたが、setterメソッドまたはdeleterメソッドについては説明していません。 this(大体)実装されていますか?setterを使ったPythonカスタムプロパティ

答えて

1

プロパティは、単純で直接的な記述子です。記述子プロトコルは、__get__,__set__および__delete__の3つのメソッドで構成されています。これらの操作のそれぞれのプロパティは、単にユーザー提供の関数を呼び出します。

class my_property(object): 
    def __init__(self, getter, setter, deleter): 
     self.getter = getter 
     self.setter = setter 
     self.deleter = deleter 

    def __get__(self, instance, owner): 
     return self.getter(instance) 

    def __set__(self, instance, value): 
     self.setter(instance, value) 

    def __delete__(self, instance): 
     self.deleter(instance) 

class Foo(object): 
    def __init__(self): 
     self._x = 42 

    def get_x(self): 
     print 'getter' 
     return self._x 

    def set_x(self, value): 
     print 'setter' 
     self._x = value 

    def del_x(self): 
     print 'deleter' 
     del self._x 

    x = my_property(get_x, set_x, del_x) 

obj = Foo() 
print obj.x 
obj.x = 69 
del obj.x 
print obj.x 
+0

私はセッターメソッド(property.setter)の実装方法に興味があります。 – Hernan

+0

@Hernan: 'fset'を変更して' self'を返します(あるいは、おそらく自分自身のコピーを返します、私は本当に覚えていません)。ロケット科学は関与していません。 –

+0

それは私が思ったものですが、私が投稿に入れたリンクでは、プロパティからサブクラス化してprint(args、kwargs)を__init__に追加したクラスの操作を見て、プロパティを再作成しているようですfsetを変更するだけではありません。これは事実ですか?何故ですか? – Hernan

0

コメント:Pythonリストオブジェクトにプロパティを追加する簡単な方法があります。クラスでのワープ。

>>> class Foo(list): pass 
>>> l = Foo([1,2,3]) 
>>> l.foo = 'bar' 
>>> l 
[1, 2, 3] 
関連する問題