为什么在Python的实例方法上使用类方法

Man*_*tis 2 python

我一直在努力让自己绕过类方法一段时间。我知道它们如何工作,但我不明白为什么要使用它们或不使用它们。

例如。

我知道我可以使用这样的实例方法:

class MyClass():
    def __init__(self):
        self.name = 'Chris'
        self.age = 27

    def who_are_you(self):
        print('Hello {}, you are {} years old'.format(self.name, self.age)

c = MyClass()
c.who_are_you()
Run Code Online (Sandbox Code Playgroud)

我也知道,通过使用类方法,可以调用who_are_you()而不创建类的实例:

    class MyClass():
        name = 'Chris'
        age = 27

        @classmethod
        def who_are_you(cls):
            print('Hello {}, you are {} years old'.format(cls.name, cls.age)

MyClass.who_are_you()
Run Code Online (Sandbox Code Playgroud)

我不明白为什么你会选择另一种方法

SPK*_*der 5

在第二个示例中,您已经将名称和年龄硬编码到该类中。如果名称和年龄确实是该类的属性,而不是该类的特定实例,那么使用类方法是有意义的。但是,如果您的类是这样Human的,那么有许多实例具有不同的名称和年龄,那么就不可能创建一个类方法来访问特定实例的唯一名称和年龄。在这种情况下,您将要使用实例方法。

一般来说:

  • 如果要整体访问一个类的属性,而不是该类的特定实例的属性,请使用类方法。
  • 如果要访问/修改与该类的特定实例相关联的属性,则需要使用实例方法。

  • 我一直在看许多类方法的示例,而您的解释是第一个对我有意义的解释。谢谢 (2认同)

agh*_*ast 5

当您没有、不需要或不能拥有实例时,将调用类方法。有时,以这种方式使用一个类可以充当单例。但类方法最常见的用途可能是作为非标准构造函数。

例如,Python类有一个名为seq, [value]dict的非标准构造函数。显然,不能涉及任何实例——重点是创建一个实例。但它不是标准构造函数,因为它采用略有不同的格式获取数据。dict.fromkeys()__init__()

标准库中有类似的方法:int.from_bytesbytes.fromhexbytearray.fromhex()float.fromhex()

如果您考虑 Unix 标准库,该fdopen函数是类似的想法 - 它从描述符而不是字符串路径构造文件。Pythonopen()将接受文件句柄而不是路径,因此它不需要单独的构造函数。但这个概念比你想象的更常见。