【问题标题】:Why does a method within a class work even if not marked with @classmethod or @staticmethod?为什么类中的方法即使没有用@classmethod 或@staticmethod 标记也能工作?
【发布时间】:2018-02-05 05:17:26
【问题描述】:

我是 Python 新手,刚刚了解它对对象/类的实现。我想我理解实例方法、类方法和静态方法之间的区别,但我不明白的是为什么可以从类本身调用一个没有被修饰为@classmethod 或@staticmethod 的方法。

我非常(非常)基本的例子:

class TestClass:
    def __init__(self):
        pass


    @staticmethod
    def print_static_stuff(stuff):
        print(stuff)


    def print_stuff(stuff):
        print(stuff)


TestClass.print_stuff("stuff")  # prints "stuff"
TestClass.print_static_stuff("static stuff")  # prints "static stuff"

方法 print_stuff() 在类上调用时似乎充当静态方法,将参数作为单个参数而不是类 (cls)。为什么不能在类上调用没有@staticclass修饰的方法?这是设计使然还是只是一个奇怪的副作用,为什么?从我目前了解到的情况来看,Python 在设计上几乎没有“奇怪的副作用”。

【问题讨论】:

  • 看看TestClass.print_self('hello') 做了什么,享受开悟的幸福...
  • 换句话说,“方法”只是普通的函数。但是,如果通过实例访问,它们将实例隐式传递给第一个参数。请注意,名称self 只是一个约定。您可以随意命名第一个参数。
  • 查看this answer 到另一个问题,我尝试用一​​些例子来解释这一点。另外,请注意TestClass.print_stuff 返回一个函数对象:<function __main__.TestClass.print_stuff>,而t.print_stuff 返回一个绑定方法对象<bound method TestClass.print_stuff of <__main__.TestClass object at 0x104226978>>
  • 如果你想看看幕后发生了什么,this 是一篇博文,解释了它使用描述符在 Python 中重新实现 FunctionMethod 对象,即它实际上是如何在幕后实现的!。
  • 我确实了解实例方法,我的问题是关于类方法。我已经修改了我的问题以使其更清楚。感谢您到目前为止的回复!

标签: python class methods


【解决方案1】:

第一个参数被命名为self 只是一个约定。该实例将作为第一个位置参数传递,与您命名它无关(在本例中,您将其命名为 stuff)。

【讨论】:

  • 我得到了实例方法,但正在询问类方法并相应地修改了我的问题。感谢您的回答!
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2021-04-12
  • 2021-07-02
相关资源
最近更新 更多