这些Python类方法输出的意义是什么?

What's the significance of these Python class method outputs?

本问题已经有最佳答案,请猛点这里访问。

假设我们有一个定义了三个方法的类:

1
2
3
4
5
6
7
8
9
10
11
12
class MyClass:

    def instance_method(self):
        return"Instance method called", self

    @classmethod
    def class_method(cls):
        return"Class method called", cls

    @staticmethod
    def static_method():
        return"Static method called"

我们实例化它并调用实例方法:

1
2
3
obj1 = MyClass()
obj1.instance_method()
# --> ('Instance method called', <__main__.MyClass at 0x106634588>)

然后我们调用类方法:

1
2
obj1.class_method()
# --> ('Class method called', __main__.MyClass)

我很难理解为什么实例方法被"<>"括起来,以及为什么它包含指向内存中某个位置的指针,而类方法却没有。


这三个都有不同的用途。但让我们从这个开始:

1
2
3
class MyClass:
    def method(x):
        return"method called", x

当您有一个实例y = MyClass()并调用y.method()时,您对函数中的x有什么期望?

  • 如果希望xy的对象,则是实例方法;
  • 如果您希望它不是y,而是y的类,那么它就是类方法(记住,您不能再检查任何特定于y的内容,只允许使用整个类的通用内容);并且
  • 如果您希望它不存在——您甚至不需要知道函数内部的对象y,也不需要知道y的类,因此x甚至不应该存在——这将是最适合静态方法的方法。我们通常对函数可以做的事情使用静态方法,但是尝试将其包装在类中,这样它就不会污染全局名称空间。