【发布时间】: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 中重新实现
Function和Method对象,即它实际上是如何在幕后实现的!。 -
我确实了解实例方法,我的问题是关于类方法。我已经修改了我的问题以使其更清楚。感谢您到目前为止的回复!