我有一个班级,他们的字段是另一个班级的实例。
class Field:
def get(self):
def set(self, value):
def delete(self):
class Document:
def __init__(self):
self.y = Field()
self.z = True
我希望能够做的是当父项的实例引用其属性时,而不是它调用孩子的方法。
d = Document()
d.y = 'some value' # Calls the `set` function of the Field
d.y == 'some value' # Calls the `get` function of the Field
del d.y # Calls the `delete` function of the Field
另一个问题是,当字段属于Field
类型时,我只想要这种行为。
我遇到递归问题尝试使用__getattr__
之类的内容,如下所示:
def __getattr__(self, key):
if isinstance(getattr(self, key), Field):
return getattr(self, key).get()
return getattr(self, key)
递归是相当明显的,为什么它会发生......但我该如何避免呢?
我已经在StackOverflow上看到了一些示例,但我似乎无法弄清楚如何绕过它。
答案 0 :(得分:1)
您所描述的内容或多或少完全是Python使用Descriptor协议访问类的属性的无效方式 -
只需让您的字段类具有[{3}}中所述的__get__
,__set__
和__delete__
方法 -
并确保所有类都有object
作为基类,否则它们继承旧样式类,出于兼容性原因仅存在于Python 2中,并且自Python 2.2以来不推荐使用(并完全忽略描述符协议) )