关于python:是否可以从继承的类中隐式地将属性分配给类?

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__,所以必须在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.__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