Python inheritance old style type in a new style class
我使用的是csv.DictWriter类,我想继承它:
1 2
| class MyObj(csv.Dictwriter):
... |
但是这个类型是一个旧样式的对象。MyObj是否可以是一个新的风格的阶级,但仍然可以从csv.DictWriter继承?
- class MyObj(csv.DictWriter, object)?如stackoverflow.com/q/11527921/3001761
是的,你只需要继承object:
1 2 3
| class MyObj(object, csv.DictWriter):
def __init__(self, f, *args, **kw):
csv.DictWriter.__init__(self, f, *args, **kw) |
- 那么,最初的方法会是什么样子呢?
- @NI6:和任何普通课程一样,请看答案。
- 嗯,这与stackoverflow.com/a/11528159/321973建议的顺序相反,因为您的方法使object的方法覆盖csv.Dictwriter的方法。使用newStyle类的关键不是显式地调用特定父类的方法,而是能够使用super(),不是吗?
- @Tobiaskienzler:object和DictWriter没有共同的方法,因此顺序并不重要。关于super见stackoverflow.com/questions/5066315/…
- @丹尼尔,这就是我认为继承错误的一个好例子。只要不使用多重继承,我们就在这里拆分头发,但假设我们是class GrandChild(MyObj, AnotherCSVThing)的子类,您要么显式地调用父母的构造函数,要么让super处理它,在这种情况下,MyObj不使用super会破坏整个mro机制…所以,tl;dr您的答案并不是不正确的,但它可能会导致将来很难调试行为…
- …是的,DictWriter不与object共享任何方法,但一般来说,即使是旧的样式类也可能实现,例如__str__,在这种情况下,它将被object的更通用的覆盖。
正如丹尼尔所说的,你需要混合object。但是,使用新样式类的一个主要点也是使用super,因此应该使用
1 2 3 4
| class MyObj(csv.DictWriter, object):
def __init__(self, csvfile, mycustomargs, *args, **kwargs):
super(MyOobj, self).__init__(csvfile, *args, **kwargs)
... |
号
如其他地方所述,object应该是最后一个父级,否则object的默认方法(如__str__和__repr__)将覆盖另一个父级的实现,这肯定不是您想要的……