2016-12-05 41 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) 
    ) 

第一個片段和第二個片段之間有什麼區別?

編輯: 作爲每攪拌機建議予理解的是

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

啊哈!不同之處在於我的工作片段中的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