我一直无法对此发现任何问题,或者我在搜索中使用了错误的命名法。如果我有类似的东西:
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
{1}}。我理解这一点,但是有可能使b
在实例化时隐式定义从a
继承的所有属性吗?
我问b / c我有几十个属性继承自具有数百个属性的类的类,我需要定义每个属性,即使它是None
类型,这样我就不会#39 ;在将对象映射到数据库表之前,必须担心检查属性是否存在。我想尽量不写代码。如果有办法做到这一点,那么我在类定义中保存了超过一千行代码,或者我可以在将对象映射到我的表之前验证每个属性是否存在,但是这些代码以及很多代码以及我有几千个要检查的属性。
答案 0 :(得分:3)
是的,但由于您在派生类中重写了__init__
,因此您必须显式初始化mro中的下一个类(父类或兄弟类)。
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
,并且已做出更正。
答案 1 :(得分:0)
由于您覆盖testone.__init__
,您必须在super()
中调用testtwo
功能。您可以做的另一件事是采用__init__
变量
class testone(object):
attone = None
atttwo = None
attthree = None
class testtwo(testone):
attfour = None