当前位置: 首页 > 面试题库 >

super()和@staticmethod交互

郤旭东
2023-03-14
问题内容

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)



 类似资料:
  • Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: def foo(x): print "executing foo(%s)"%(x) class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod

  • 问题内容: 我想要 我以为我可以 但这会引发异常: 问题答案: python中的单例毫无意义。 Python的与simple有所不同,因此并不总是那么简单。但是出于您的目的,这似乎就足够了:

  • 在路径上使用 super (父级)和 self(自身)关键字,可以在访问项时消除歧义和防止不必要的路径的硬编码。 fn function() { println!("called `function()`"); } mod cool { pub fn function() { println!("called `cool::function()`"); }

  • 问题内容: 有人可以给我解释 中 的含义吗?我需要知道区别和含义。 据我了解,告诉一个类它是一个应该继承到子类中的方法,或者……某种东西。但是,这有什么意义呢?为什么不直接定义不添加类方法或任何@定义? tl; dr: 我什么时候应该使用它们,为什么要使用它们,以及如何使用它们? 我对非常了解,因此使用更高级的编程概念应该不是问题。如果可能,请给我相应的示例。 问题答案: 尽管和非常相似,但是这两

  • 本文向大家介绍Python中staticmethod和classmethod的作用与区别,包括了Python中staticmethod和classmethod的作用与区别的使用技巧和注意事项,需要的朋友参考一下 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。 这有利于组织代

  • rank ▲ ✰ vote url 14 805 326 554 url 装饰器@staticmethod和@classmethod有什么区别? 也许一些例子会有帮助:注意foo, class_foo 和static_foo参数的区别: class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,