【问题标题】:Python inheritance old style type in a new style classPython在新样式类中继承旧样式类型
【发布时间】:2016-04-22 20:58:40
【问题描述】:

我正在使用csv.DictWriter 类,我想继承它:

class MyObj(csv.Dictwriter):
    ...

但是这种类型是老式的对象。 MyObj 可以是新式类但仍继承自 csv.DictWriter 吗?

【问题讨论】:

标签: python inheritance


【解决方案1】:

作为丹尼尔正确states,您需要混合object。但是,使用新式类的一大要点也是使用super,因此您应该使用

class MyObj(csv.DictWriter, object):
    def __init__(self, csvfile, mycustomargs, *args, **kwargs):
        super(MyOobj, self).__init__(csvfile, *args, **kwargs)
        ...

如提到elsewhereobject 应该是最后一个父级,否则object 的默认方法如__str____repr__ 会覆盖另一个父级的实现,这肯定不是你想要的。 ..

【讨论】:

    【解决方案2】:

    是的,您也只需从 object 继承:

    class MyObj(object, csv.DictWriter):
        def __init__(self, f, *args, **kw):
            csv.DictWriter.__init__(self, f, *args, **kw)
    

    【讨论】:

    • 那么__init__ 会是什么样子?
    • @NI6:与任何普通课程一样,请参阅答案。
    • 嗯,这是stackoverflow.com/a/11528159/321973 建议的相反顺序,因为您的方式使object 的方法覆盖csv.Dictwriter 的方法。而使用新式类的真正意义在于不是显式调用特定父类的方法,而是能够使用super(),不是吗?
    • @Daniel 这实际上是我认为错误继承的一个很好的例子。只要不使用多重继承,我们就在这里分心,但假设我们将class GrandChild(MyObj, AnotherCSVThing) 子类化,您要么必须显式调用 both 父母的构造函数,要么让super 处理它,在哪种情况MyObj not 使用super 会破坏整个 MRO 机制...所以 TL;DR 你的答案并不正确,但它可能导致困难-将来要调试的行为...
    • ...是的,DictWriter 不与object 共享任何方法,但总的来说,即使是旧式类也可能实现例如__str__,在这种情况下,它会被object 更通用的<MyObj object at 0x0001240105015618616> 覆盖
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 2019-06-23
    • 2023-03-10
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多