【问题标题】:Is it possible to implicitly assign attributes to a class, from an inherited class? [duplicate]是否可以从继承的类中将属性隐式分配给类? [复制]
【发布时间】: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


【解决方案1】:

是的,但是由于您在派生类中重写了__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,并进行了更正。

【讨论】:

  • 是的,你是对的,我确实打算继承“testone”。我刚刚纠正了它。
  • 这正是我所需要的。我在问这个问题之前阅读了class inheritance 上的python 文档,但是没有对此进行解释,并且唯一提到 super() 涉及多重继承的情况,所以我没有点击 super() 并阅读它的文档,它继续完美地解释我的情况的解决方案。
【解决方案2】:

由于您覆盖了testone.__init__,您将不得不调用testtwo 中的super() 函数。您可以做的另一件事是使用__init__ 变量

class testone(object):
    attone = None
    atttwo = None
    attthree = None

class testtwo(testone):
    attfour = None

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 2021-12-20
    • 2016-01-26
    • 1970-01-01
    • 2014-02-13
    • 2020-03-05
    • 2014-11-09
    • 2019-07-10
    相关资源
    最近更新 更多