是否可以扩展旧的和新的样式类?

har*_*dsv 5 python

当我扩展一些工具生成的类时,我没有意识到它们是旧样式类,直到我尝试使用super().super()不适用于旧样式类,所以我收到了这个错误:

TypeError: super() argument 1 must be type, not classobj
Run Code Online (Sandbox Code Playgroud)

例如,试试这个片段:

>>> class A:
...     def greet(self):
...         print "A says hi"
...
>>> class B(A):
...     def greet(self):
...         print "B says hi"
...
>>> super(B, B()).greet()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: super() argument 1 must be type, not classobj
Run Code Online (Sandbox Code Playgroud)

我只是好奇如果我从对象扩展B以使它成为一个新的样式类会发生什么,它似乎使super()工作.

>>> class B(A, object):
...     def greet(self):
...         print "B says hi"
...
>>> super(B, B()).greet()
A says hi
Run Code Online (Sandbox Code Playgroud)

这是一个合适的解决方法还是稍后会产生一些不良后果?

ste*_*eha 1

如果您无法更改生成器以生成新样式的类,您可以对文件进行后处理以使它们成为新样式:

import re
pat = re.compile("^(.*class\s+\w+)(:.*)$")
out_file = open("edited_file.py", "w")
for line in open("generated_file.py"):
    m = pat.match(line)
    if m:
        line = m.group(1) + "(object)" + m.group(2) + "\n"
    out_file.write(line)

out_file.close()
Run Code Online (Sandbox Code Playgroud)

如果您出于某种原因不想这样做,那么当然可以继续对原始类和object. 据我所知,这应该可以正常工作;你们的新班级将是一个新风格的班级。

Python in a Nutshell (Alex Martelli 着,O'Reilly 出版)一书说,如果你用基类声明一个类,并且至少有一个基类是新式的,那么它永远是新式类。它没有列出与此操作相关的任何特殊警告或危险。我想你可以走了。