Is it possible to implicitly assign attributes to a class, from an inherited class?
我找不到任何关于这个的问题,或者我在搜索中使用了错误的术语。如果我有类似的东西:
1 2 3 4 5 6 7 8 9
| class testone(object):
def __init__(self):
self.attone = None
self.atttwo = None
self.attthree = None
class testtwo(testone):
def __init__(self):
self.attfour = None |
我这样做:
1 2 3 4 5
| a = test()
print dir(a)
b = testtwo()
print dir(b) |
可以看出,a将具有所有定义为None的属性,但b将只定义attfour,即使它继承了testone类。我理解这一点,但是否有可能使b具有从a继承的所有属性,并在实例化时进行隐式定义?
我要求b/c我有几十个属性的类,这些属性是从具有数百个属性的类继承而来的,我需要定义每个属性,即使它是None类型的,这样我就不必担心在将属性从我的对象映射到数据库表之前检查它是否存在。我尽量不写那么多代码。如果有一种方法可以做到这一点,那么我在类定义中保存了超过1000行的代码,或者我可以在将对象映射到我的表之前验证每个属性是否存在,但是这是大量的代码,而且我还有几千个属性要检查。
- 您替换了子类中的__init__方法;您希望调用被重写的版本。super().__init__()可以这样做(python 3),或者super(testtwo, self).__init__()(python 2和3)。
- @马蒂皮耶特不知道这是怎么一个重复的问题,但哦,好吧。我的问题不是问如何"调用父类的方法"或属性。我的问题是在子类的实例化时隐式定义所有父类属性。同样,提问者已经意识到了超级解决方案。我不知道super(),因为它只在类继承文档中提到过一次,然后在讨论多重继承时才提到过,这与我的问题无关。
- 您需要调用父级__init__方法。我把它理解为‘我如何调用父__init__方法,而不是‘我应该调用父__init__方法吗?’,答案是:"是的,因为该方法设置了这些属性,而没有其他属性"。
- 这就是我为什么写"也许我在搜索中使用了错误的术语"。我知道我想要什么,但不能用语言表达。我还没有意识到我需要的解决方案是在父类上调用init方法。这么说,它确实是一个复制品。谢谢你的帮助。
是的,但是由于您已经在派生类中重写了__init__,所以必须在mro(父类或同级类)中显式初始化下一个类。
1 2 3 4 5 6 7 8 9 10
| class testone(object):
def __init__(self):
self.attone = None
self.atttwo = None
self.attthree = None
class testtwo(testone):
def __init__(self):
self.attfour = None
super(testtwo, self).__init__() # on python3 just use super() |
有关继承的更多详细信息,请阅读super上的文档。
注:我想你是想让testtwo继承你的问题中的testone,并作了更正。
- 是的,你是对的,我确实打算继承"testone"。我刚刚更正了。
- 这正是我需要的。在问这个问题之前,我阅读了关于类继承的python文档,但是没有对此进行解释,并且只提到super()涉及多重继承的情况,所以我没有单击super()并阅读它的文档,在那里它可以完美地解释我的情况的解决方案。
由于您超越了testone.__init__,您必须调用testtwo中的super()函数。你可以做的另一件事是取__init__变量
1 2 3 4 5 6 7
| class testone(object):
attone = None
atttwo = None
attthree = None
class testtwo(testone):
attfour = None |