2016-02-28 106 views
1

我一直试图让我的头在classmethods一段时间。我知道他们是如何工作的,但我不明白为什么要使用它们或不使用它们。为什么要在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() 

我也知道,通过使用类方法我可以调用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

当你有实例变量时使用实例方法。使用类方法,您不能使用不同的年龄或名称的不同实例 –

+1

请参阅:http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner –

+1

您通常不会创建一个班级来代表一个人。通常,您创建一个类Person,并创建它的实例来表示一个人。 – GingerPlusPlus

回答

3

在你的第二个例子中,你已经将名字和年龄硬编码到类中。如果名称和年龄确实是类的属性而不是类的特定实例,那么比使用类方法更有意义。但是,如果您的课程类似Human,其中有许多具有不同名称和年龄的实例,则无法创建类方法来访问特定实例的唯一名称和年龄。在这种情况下,你会想使用一个实例方法。

一般:

  • 如果您要访问一个类的属性,作为一个整体,而不是这个类的一个特定实例的属性,使用一个类的方法。
  • 如果您想要访问/修改与某个特定类的实例关联的属性,那么您将需要使用实例方法。
+1

我一直在寻找很多classmethod的例子,你的解释是第一个对我有意义的解释。谢谢 – Mantis

0

@classmethod声明该方法是静态的,因此您可以在不创建新的类实例的情况下使用它。另一方面,在第一个例子中,你必须在使用方法之前创建实例。 静态方法对于MVC模式等中的控制器非常有用,而模型中使用了非静态方法。 更多@classmethod这里@staticmethod https://stackoverflow.com/a/12179752/5564059

0

类方法被调用时你没有,或者不需要,或者不能有,一个实例。有时候,一个类可以用这种方式作为单例。但是可能最常用的类方法是作为一个非标准的构造函数。

例如,Python的dict类有一个非标准的构造称为dict.fromkeys(SEQ [值])。显然,不存在任何实例 - 整个过程就是创建一个实例。但它不是标准的__init__()构造函数,因为它的数据格式稍有不同。

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

如果您想到Unix标准库,fdopen函数是一个类似的想法 - 它从一个描述符而不是一个字符串路径构造一个文件。 Python的open()将接受文件句柄而不是路径,所以它不需要单独的构造函数。但是这个概念比你想象的更普遍。

相关问题