2016-12-05 2 views
3

にプロパティオブジェクトを割り当てるたぶん、あなたは、プロパティを定義し、そのようなオブジェクトに割り当てることができます:インラインオブジェクト

a = property(lambda self: getattr(self, "_a"), lambda self, x: setattr(self, "_a", x+1)) 
b = type("B", (object,), {"a": a, "_a": None}) 

b.a = 2は、プロパティが上書きされます呼び出すことが判明しました。

これは私が傾斜オブジェクトで複製しようとしているものです。

class B: 
    _a = None 

    @property 
    def a(self): 
     return self._a 

    @a.setter 
    def a(self, x): 
     self._a = x 

これはいくつかの手掛かりを与えるかもしれません。

class B: 
    _a = None 
    a = property(
     lambda self: getattr(self, "_a"), 
     lambda self, x: setattr(self, "_a", x+1) 
    ) 

最初のスニペットと2番目のスニペットの違いは何ですか?

編集: Iは

a = property(lambda self: getattr(self, "_a"), lambda self, x: setattr(self, "_a", x+1)) 
B = type("B", (object,), {"a": a, "_a": None}) 
b = B() 
b.a = 2 
print(b.a) 

>>> 3 
+2

'B =タイプ(...)は'新しいタイプではなく、新しいタイプのインスタンスを定義します。名前を 'B = type(...)'に変更し、それを他のクラス定義と同じように使用すると、私の意図どおりに動作します。何か不足していますか? – Blender

+0

Aha!違いは、私の動作していないスニペットのbがインスタンス化されていないということでした。ありがとうございました。 – Simon

答えて

4

b = type(...)新しいタイプではなく、新しいタイプのインスタンスを定義することが理解ブレンダー提案あたりとして。私はB = type(...)に名前を変更し、あなたが他のクラス定義と同じように、それを使用したい:

In [25]: a = property(lambda self: getattr(self, "_a"), lambda self, x: setattr(self, "_a", x+1)) 

In [26]: B = type("B", (object,), {"a": a, "_a": None}) 

In [27]: b = B() 

In [28]: b.a = 10 

In [29]: b.a 
Out[29]: 11 
関連する問題