super()和@staticmethod交互
super()是否不打算与静态方法一起使用?
当我尝试类似的东西
class First(object):
@staticmethod
def getlist():
return ['first']
class Second(First):
@staticmethod
def getlist():
l = super(Second).getlist()
l.append('second')
return l
a = Second.getlist()
print a
我收到以下错误
Traceback (most recent call last):
File "asdf.py", line 13, in <module>
a = Second.getlist()
File "asdf.py", line 9, in getlist
l = super(Second).getlist()
AttributeError: 'super' object has no attribute 'getlist'
如果我将静态方法更改为类方法,并将类实例传递给super(),则一切正常。我是在这里错误地调用super(type)还是缺少我想要的东西?
-
的简短答案
我是在这里错误地调用super(type)还是缺少我想要的东西?
是:是的,您打错了它的名称……而且(实际上是 因为 ),您缺少某些内容。
但是不要难过。这是一个极其困难的课题。
该文档指出
如果省略第二个参数,则返回的超级对象是未绑定的。
未绑定
super
对象的用例极为狭窄且很少见。请参阅Michele Simionato撰写的有关以下内容的文章super()
:- 关于Python Super的一些知识[1 of 3]
- 关于Python Super的注意事项[3之2](这一部分专门介绍了未绑定的super)
- 关于Python Super的一些知识[3 of 3]
此外,他强烈主张
super
从此处删除Python
3中的未绑定内容。我说过您称其为“错误地”(尽管没有上下文,正确性在很大程度上是没有意义的,而且玩具示例并不能提供太多上下文)。
super
正如Simionato所言,由于未绑定非常罕见,并且可能完全没有道理,因此“正确”的使用方法super()
是提供第二个论点。就您而言,使示例工作最简单的方法是
class First(object): @staticmethod def getlist(): return ['first'] class Second(First): @staticmethod def getlist(): l = super(Second, Second).getlist() # note the 2nd argument l.append('second') return l a = Second.getlist() print a
如果您认为这样看起来很有趣,那您就没错。但是我认为,大多数人在看到
super(X)
(或希望在自己的代码中尝试时)所期望的就是Python为您提供的super(X, X)
。