tôi muốn thêm nhiều hình nộm-tính đến một lớp học thông qua một trang trí, như thế này:Làm cách nào để thêm thuộc tính vào lớp bằng trình trang trí có danh sách tên làm đối số?
def addAttrs(attr_names):
def deco(cls):
for attr_name in attr_names:
def getAttr(self):
return getattr(self, "_" + attr_name)
def setAttr(self, value):
setattr(self, "_" + attr_name, value)
prop = property(getAttr, setAttr)
setattr(cls, attr_name, prop)
setattr(cls, "_" + attr_name, None) # Default value for that attribute
return cls
return deco
@addAttrs(['x', 'y'])
class MyClass(object):
pass
Thật không may, decoarator dường như để giữ tham chiếu của attr_name
thay vì nội dung của nó. Do đó, MyClass.x
và MyClass.y
truy cập cả MyClass._y
:
a = MyClass()
a.x = 5
print a._x, a._y
>>> None, 5
a.y = 8
print a._x, a._y
>>> None, 8
gì làm tôi phải thay đổi để có được những hành vi mong đợi?