首页 > 解决方案 > 如何在 Python 中继承和扩展类属性?

问题描述

我在网上做了很多研究,但我没有找到正确的方法来用子类中的新值扩展“类”属性字典。大多数文档都在方法内部扩展属性。

我试过dictionary.update()了,但它不起作用。

这是我的例子:

class Super(object):
    dictionary = {'one':1, 'two':2}

    def __init__(self, var):
        self.var = var

    def supermethod(self):
        pass

我将其扩展到:

class Subclass(Super):
    dictionary.update({"zero":0})

    def __init__(self, var):
        super(Subclass, self).__init__(var)
        self.var = var

    def submethod(self):
        pass

如果我覆盖字典 - 它工作正常。但是如果我尝试扩展,它会给我:

AttributeError:“子类”对象没有属性“字典”

标签: pythonoopdictionaryinheritanceattributes

解决方案


在 Python 中,class是一个可执行语句。当解释器找到一条class语句时,首先class执行语句块中的所有代码(在一个特殊的命名空间中),然后使用该块中定义的所有名称来构建class对象(Python 类是对象),最后是类名绑定到当前范围内的类对象。

IOW,在 class 语句的块中,class对象还不存在,因此它不能被引用,既不能显式(通过类名)也不能隐式(Python 过度强调显式而不是隐式)。

哦,此时父类对象确实存在(否则您无法从它继承),因此您可以显式引用它:

class Parent(object):
   attr = something()


class Child(Parent):
   attr = Parent.attr
   # do something with Parent.attr

请注意,类语句块(此处attr)中定义的属性是“类属性”,即class对象的 IOW 属性,因此在实例之间共享。当这个属性是一个可变对象时,从一个实例改变它会影响所有实例。

还要记住 Python从不隐式复制任何东西,所以下面的代码:

class Parent(object):
   attr = {"foo": "bar"}


class Child(Parent):
   attr = Parent.attr
   attr["baaz"] = "quux"
   # or attr.update(baaz="quux") etc

将更新Parent.attr


推荐阅读