【发布时间】:2018-09-11 17:30:54
【问题描述】:
目的是在列表中提供一些字符串作为类的属性。该类不仅应具有属性,还应具有相应的 getter 和 setter 方法。在其他一些继承自的类中,其中一些设置器需要被覆盖。
为此,我想出了以下内容。在字符串列表的循环中使用setattr,创建一个属性和相应的方法。关于第一部分,代码按预期工作。
但是我无法覆盖继承类中的设置器。
class Base():
attributes = ["attr{}".format(i) for i in range(100)]
def __init__(self):
_get = lambda a: lambda : getattr(self, a)
_set = lambda a: lambda v: setattr(self, a, v)
for attr in self.attributes:
setattr(self, attr, None)
setattr(self, "get_"+attr, _get(attr))
setattr(self, "set_"+attr, _set(attr))
class Child(Base):
def __init__(self):
super().__init__()
#setattr(self, "set_attr4", set_attr4)
# Here I want to override one of the setters to perform typechecking
def set_attr4(self, v):
print("This being printed would probably solve the problem.")
if type(v) == bool:
super().set_attr4(v)
else:
raise ValueError("attr4 must be a boolean")
if __name__ == "__main__":
b = Base()
b.attr2 = 5
print(b.get_attr2())
b.set_attr3(55)
print(b.get_attr3())
c = Child()
c.set_attr4("SomeString")
print(c.get_attr4())
这里的输出是
5
555
SomeString
然而,预期的输出是
5
555
This being printed would probably solve the problem.
ValueError("attr4 must be a boolean")
所以不知何故,set_attr4 方法永远不会被调用;我猜这是意料之中的,因为在读入类结构之后会调用__init__。但是我不知道如何覆盖这些方法。我尝试添加setattr(self, "set_attr4", set_attr4)(上面代码中的注释行)但无济于事。
或者更一般地说,propery 通常用于创建 getter 和 setter。但我认为我不明白如何在 getter 和 setter 是动态创建并且需要被孩子覆盖的情况下应用它。
有什么解决办法吗?
由于 cmets 的更新:有几个人指出,在 python 中使用 getter/setter 可能不是一种好的样式,并且通常可能不需要它们。虽然这绝对是要记住的事情,但这个问题的背景是我正在扩展一个旧的现有代码,该代码始终使用 getter/setter。因此,我不希望更改样式并让用户(这个项目总共只有大约 20 个用户,但仍然......)突然改变他们访问 API 中属性的方式。
然而,任何未来的读者可能会认为 getter/setter 方法至少是有问题的。
【问题讨论】:
-
为什么要在all中创建getter和setter?
-
@juanpa.arrivillaga 感谢您指出这一点,我更新了问题,原因是我确实想在这里使用 getter/setter。
标签: python python-3.x class inheritance