是否可以从继承的类隐式地为类分配属性?

时间:2016-05-06 16:44:47

标签: python inheritance

我一直无法对此发现任何问题,或者我在搜索中使用了错误的命名法。如果我有类似的东西:

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 ;在将对象映射到数据库表之前,必须担心检查属性是否存在。我想尽量不写代码。如果有办法做到这一点,那么我在类定义中保存了超过一千行代码,或者我可以在将对象映射到我的表之前验证每个属性是否存在,但是这些代码以及很多代码以及我有几千个要检查的属性。

2 个答案:

答案 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