super()和@staticmethod交互

发布于 2021-01-29 17:50:56

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)还是缺少我想要的东西?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    的简短答案

    我是在这里错误地调用super(type)还是缺少我想要的东西?

    是:是的,您打错了它的名称……而且(实际上是 因为 ),您缺少某些内容。

    但是不要难过。这是一个极其困难的课题。

    文档指出

    如果省略第二个参数,则返回的超级对象是未绑定的。

    未绑定 super对象的用例极为狭窄且很少见。请参阅Michele Simionato撰写的有关以下内容的文章super()

    此外,他强烈主张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)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看