gpt4 book ai didi

python - 用同名的@property 覆盖基类属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:30 34 4
gpt4 key购买 nike

我正在尝试子类化 python 类并使用 @property 函数覆盖常规属性。问题是我无法修改父类,子类的 api 需要看起来与父类相同(但行为不同)。 (所以我的问题不同于this one,其中父类还使用@property 方法访问底层属性。)

最简单的例子是

# assume this class can't be overwritten
class Parent(object):
def __init__(self, a):
self.attr = a

# how do I make this work?
class Child(Parent):
def __init__(self, a):
super(Child, self).__init__(a)

# overwrite access to attr with a function
@property
def attr(self):
return super(Child, self).attr**2

c = Child(4)
print c.attr # should be 16

这会在调用父级 init 方法时产生错误。

<ipython-input-15-356fb0400868> in __init__(self, a)
2 class Parent(object):
3 def __init__(self, a):
----> 4 self.attr = a
5
6 # how do I make this work?

AttributeError: can't set attribute

希望清楚我想做什么以及为什么。但我不知道该怎么做。

最佳答案

这很容易通过添加 setter 方法来解决

class Child(Parent):
def __init__(self, a):
self._attr = None
super(Child, self).__init__(a)

# overwrite access to a with a function
@property
def attr(self):
return self._attr**2

@attr.setter
def attr(self, value):
self._attr = value

关于python - 用同名的@property 覆盖基类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359967/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com