我一直在努力让自己绕过类方法一段时间。我知道它们如何工作,但我不明白为什么要使用它们或不使用它们。
例如。
我知道我可以使用这样的实例方法:
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)
我不明白为什么你会选择另一种方法
在第二个示例中,您已经将名称和年龄硬编码到该类中。如果名称和年龄确实是该类的属性,而不是该类的特定实例,那么使用类方法是有意义的。但是,如果您的类是这样Human的,那么有许多实例具有不同的名称和年龄,那么就不可能创建一个类方法来访问特定实例的唯一名称和年龄。在这种情况下,您将要使用实例方法。
一般来说:
当您没有、不需要或不能拥有实例时,将调用类方法。有时,以这种方式使用一个类可以充当单例。但类方法最常见的用途可能是作为非标准构造函数。
例如,Python类有一个名为seq, [value]dict的非标准构造函数。显然,不能涉及任何实例——重点是创建一个实例。但它不是标准构造函数,因为它采用略有不同的格式获取数据。dict.fromkeys()__init__()
标准库中有类似的方法:int.from_bytes、bytes.fromhex和bytearray.fromhex()。float.fromhex()
如果您考虑 Unix 标准库,该fdopen函数是类似的想法 - 它从描述符而不是字符串路径构造文件。Pythonopen()将接受文件句柄而不是路径,因此它不需要单独的构造函数。但这个概念比你想象的更常见。