实例变量不继承

use*_*779 1 python inheritance

import abc

class Agenda(metaclass=abc.ABCMeta):
    def __init__(self):
        self.__items = []

    @abc.abstractclassmethod 
    def addItem(self,item):
        pass

    @abc.abstractclassmethod 
    def getItem (self):
        pass

    def isEmpty(self):
        return self.__items == []

    def clear(self):
        self.__items = []

class StackAgenda(Agenda):
    def __init__(self):
        super().__init__()

    def addItem(self,item):
        self.__items.append(item)

    def getItem(self):
        return self.__items.pop()
Run Code Online (Sandbox Code Playgroud)

当我尝试使用任何 StackAgenda 方法时,它告诉我 StackAgenda 对象没有 self.__items 属性。我真的不明白为什么会发生这种情况,我可能犯了一个我找不到的愚蠢错误。提前致谢!

Sea*_*ira 5

您遇到了名称修改- 将双下划线前缀更改为单下划线,您将能够访问_items.

__当您使用(双下划线)时,Python 通过将成员的名称更改为_{classname}{original_name}原始类中引用它的位置来为您提供伪私有成员。您仍然可以通过显式引用重命名的字段来获取子类中的成员,但这就像打破静态类型语言中的反射一样......这意味着所有其他选项都失败了。

您可能想要做的是为您的抽象方法提供一个实现:

# These are methods, not class methods
@abc.abstractmethod 
def addItem(self, item):
    self.__items.append(item)

@abc.abstractmethod 
def getItem (self):
    return self.__items.pop()
Run Code Online (Sandbox Code Playgroud)

然后,在你的子类中,你可以调用super().getItem()and super().addItem(item)...但在这种情况下,实际上不需要 ABC。

  • Python 中没有“私有/公共”访问。只是开发者大会。 (3认同)