gpt4 book ai didi

Python - 从抽象类继承时属性返回旧值

转载 作者:行者123 更新时间:2023-12-04 02:31:51 24 4
gpt4 key购买 nike

我的问题是关于继承的类解析顺序。这是说明我的问题的虚拟代码片段:

from abc import ABC, abstractmethod

class BaseClass(ABC):
def __init__(self):
self.__value = 1
self.set_value()

@abstractmethod
def set_value(self):
raise NotImplementedError

@property
def value(self):
return self.__value

class DerivedClass(BaseClass):
def __init__(self):
super().__init__()

def set_value(self):
self.__value = 2

dc = DerivedClass()
print(dc._DerivedClass__value)
print(dc.value)
assert dc.value == 2

代码输出:

2
1
Traceback (most recent call last):
File "<stdin>", line 26, in <module>
AssertionError

我希望 DerivedClass__init__ 中调用之前覆盖 set_value 方法。然而,情况并非如此,因为该属性以某种方式记住了原始 .__value 值而不是新值。有人可以向我解释为什么会这样吗?

在这种情况下,什么是好的解决方案?我的真实案例是一个相当大的基类,其中继承类仅覆盖关键方法 - 例如本例中的 .set_value

最佳答案

因为您使用了双下划线名称修饰,self.__value。这可以防止子类能够覆盖 __value,这是它的唯一目的

如果你想修复它,使用常规的下划线:

self._value

关于Python - 从抽象类继承时属性返回旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63786893/

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