【发布时间】:2016-09-01 19:57:11
【问题描述】:
我无法找到任何关于此的问题,或者我在搜索中使用了错误的命名法。如果我有类似的东西:
class testone(object):
def __init__(self):
self.attone = None
self.atttwo = None
self.attthree = None
class testtwo(testone):
def __init__(self):
self.attfour = None
我愿意:
a = test()
print dir(a)
b = testtwo()
print dir(b)
可以看到a 将其所有属性定义为None,但b 将仅定义attfour,即使它继承类testone。我理解这一点,但是是否有可能使b 在实例化时也隐式定义从a 继承的所有属性?
我问 b/c 我有具有数十个属性的类,这些属性继承自具有数百个属性的类,我需要定义每个属性,即使它是 None 类型,这样我就不必担心在将属性从我的对象映射到数据库表之前检查属性是否存在。我试图不写那么多代码。如果有办法做到这一点,那么我在类定义中保存了超过一千行代码,或者我可以在将对象映射到我的表之前验证每个属性是否存在,但这是很多代码,而且我有一个几千个属性要检查。
【问题讨论】:
-
你替换了子类中的
__init__方法;你想调用 overridden 版本。super().__init__()可以做到这一点(Python 3),或者super(testtwo, self).__init__()(Python 2 和 3)。 -
@MartijnPieters 不确定这是如何与该问题重复,但哦,好吧。我的问题不是问如何“调用父类的方法”或属性。我的问题询问在子类的实例化时隐式定义所有父类属性。此外,提问者已经知道超级解决方案。我不知道 super() 因为它只在 class inheritance doc 中提到过一次,然后才在讨论多重继承时才提到,我的问题与此无关。
-
您需要调用父
__init__方法。我将其读作“如何我如何调用父__init__方法,而不是“应该我调用父__init__方法?”,答案是:“是的,因为该方法设置了这些属性,仅此而已”。 -
这就是为什么我写“也许我在搜索中使用了错误的命名法”。我知道我想要什么,但无法用言语表达。我没有意识到我需要的解决方案是在父类上调用 init 方法。这么说,它确实是有道理的,它是重复的。谢谢你的帮助。
标签: python inheritance