【问题标题】:python function behaves differentlypython函数的行为不同
【发布时间】:2019-04-12 09:08:37
【问题描述】:

使用参数“self”的方法“print”声明一个类:

class First:
  def print(self): 
    print('working') 
    return 2

尝试在不实例化类的情况下调用方法:
First.print() 收到以下消息:

TypeError: print() missing 1 required positional argument: 'self'

现在在实例化类和访问方法时:它正在工作。

first = First()
first.print()

# working
# 2

现在在方法 print 中定义没有任何参数的同一个类:

class First:
  def print():
    print('working')
    return 2

在不实例化类的情况下调用相同的方法并且它正在工作:

First.print()

# working
# 2

没有定义方法参数,python 方法的行为类似于静态。是真的还是别的什么?

【问题讨论】:

  • 请更正您问题的格式(尤其是源代码)
  • 在第一次执行中,您尝试调用它而不实例化它,因此没有“自我”传递给该方法,这就是它失败的原因。
  • 在那个例子中显然是一个不使用self的静态方法,比如你的第二个例子。您可以在相关问题stackoverflow.com/questions/18679803/… 中查看更多示例
  • 非常感谢您的澄清..

标签: python function


【解决方案1】:

self 引用绑定的变量或对象。所以它需要实例化。其中没有self 方法变为静态(python 上下文中的类方法)并且可以使用类名调用。 此外,您应该在方法定义上方编写 @classmethod 装饰器。以便清楚地表明它是classmethod

class First:
  @classmethod
  def print(cls):
    print('working')
    return 2
First.print()

供您参考 https://medium.com/quick-code/understanding-self-in-python-a3704319e5f0

【讨论】:

  • 出于好奇,他的第二个例子和使用@staticmethod有什么区别?
  • 如果你写@staticmethod,那将是pythonic的方式。他的第二个例子基本上是一个静态方法。
【解决方案2】:

在第一种情况下,它是一个一个参数的函数。所以,Class.f() 失败了。在第二个示例中,它是 zero 参数的函数。所以,Class.f() 有效。

创建实例时,第一个参数会自动绑定到该实例,需要传递n-1参数。因此,它在您的第一个示例中有效,但在您的第二个示例中无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2020-11-09
    • 2015-06-18
    • 2016-11-04
    相关资源
    最近更新 更多