python - 如何在 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:“子类”对象没有属性“字典”
解决方案
在 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
。
推荐阅读
- typescript - 数字和通用参数之间的区别
- alpacajs - 需要的单选字段,没有羊驼形式的默认选择
- python-3.x - ModuleNotFoundError:没有名为“tensorflow.compat”的模块
- javascript - 如何在 JavaScript 中正确覆盖 console.warn
- api - Flutter 从 API 获取数据以构建方法
- javascript - 在 javascript 中更改 CSSOM css 样式属性
- php - Woocommerce(感谢页面)在订单概览字段中添加自定义 meta_key
- scala - 为什么案例模式匹配匿名函数可以有两个签名,并具有神奇的调用站点兼容性
- java - 如何解决 java.lang.OutOfMemoryError:Weblogic 中超出 GC 开销限制?
- html - 如何在less中添加通用样式以及基于动态类添加不同样式