我正在尝试一个在python中进行验证的小型数据库管理器,我面临着这样的问题:
如果我使用像这样的@属性:
class Attribute (object):
def __init__ (self, value=None):
self._value = value
@property
def value (self):
return self._value
@value.setter
def value (self, value):
if isinstance(value,int):
self._value = value
else:
self._value = None
class A (object):
def __init__ (self):
self.a = Attribute()
ia = A()
然后,我可以以ia.a.value
的形式访问已验证的值,并使用ia.a.value=<some int>
将其设置为int
。但是我希望ia.a
能够访问它(没有value
)
我已经尝试了我能够考虑的大多数变体(由崇高文本2自动生成)代码:
def attribute ():
def fget (self):
return self._value
def fset (self, value):
if isinstance(value,int):
self._value = value
else:
self._value = None
return locals()
class A (object):
def __init__ (self):
self.a = property(**attribute())
ia = A()
当我执行print(type(ia.a))
时,它输出类似于"<property object at 0x7ffa84a8a7e0>
“的内容,但是当我用ia.a=3
更改值时,它就被称为int
。实际上,setter没有被调用,赋值和往常一样(例如,我可以为属性分配一个字符串)。
我想要做的是通过向attribute
函数传递一个参数,并使用每个用户定义的类属性的名称来设置一些动态类,以便在该函数中使用getattr
、setattr
和delattr
来定义实例属性。
我怎么能这么做?parameter
构造函数的正确用法是什么?
发布于 2015-10-10 10:29:43
问题是属性对象应该在class
(作为类属性)上设置,而不是在实例上设置,这就是为什么您的属性从未调用setter/getter。
对于你的案子,你可以简单地做-
class A:
a = property(**attribute())
https://stackoverflow.com/questions/33057463
复制