我一直试图让我的头脑方法暂时停留一段时间。我知道它们是如何工作的但我不明白为什么要使用它们或不使用它们。
例如。
我知道我可以使用像这样的实例方法:
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()
我也知道通过使用classmethod我可以调用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()
我不明白为什么你会选择一种方法而不是另一种方法
答案 0 :(得分:4)
在你的第二个例子中,你已经将名字和年龄硬编码到课堂上。如果name和age确实是类的属性而不是类的特定实例,那么使用类方法是有意义的。但是,如果您的类类似于Human
,其中有许多具有不同名称和年龄的实例,则无法创建类方法来访问特定实例的唯一名称和年龄。在这种情况下,您可能希望使用实例方法。
一般来说:
答案 1 :(得分:0)
@classmethod声明该方法是静态的,因此您可以在不创建新的类实例的情况下使用它。另一方面,在第一个示例中,您必须在使用方法之前创建实例。 静态方法对于MVC模式等中的控制器非常有用,而非静态方法用于模型中。 更多关于@classmethod和@staticmethod的信息 https://stackoverflow.com/a/12179752/5564059
答案 2 :(得分:0)
当您没有或不需要或不具有实例时,将调用类方法。有时,当使用这种方式时,类可以作为单身人士使用。但是,类方法最常见的用法可能是作为非标准构造函数。
例如,Python dict
类有一个名为dict.fromkeys(
seq,[value] )
的非标准构造函数。显然,不会涉及任何实例 - 重点是创建一个实例。但它不是标准的__init__()
构造函数,因为它采用的格式略有不同。
标准库中有类似的方法:int.from_bytes
,bytes.fromhex
和bytearray.fromhex()
以及float.fromhex()
。
如果你考虑Unix标准库,fdopen
函数是一个类似的想法 - 它从描述符而不是字符串路径构造一个文件。 Python的open()
将接受文件句柄而不是路径,因此它不需要单独的构造函数。但这个概念比你想象的更常见。