我试图了解类方法.根据我的阅读,我们必须在定义时将cls作为第一个参数传递给类方法(类似于我们将self作为第一个参数传递的实例方法).但是我看到即使我将self作为类方法的第一个参数传递它也能工作.谁能解释一下这是如何工作的?
我已经看到他们将类定义为类方法的一些用法,但他们仍然将self作为第一个参数而不是cls.我想了解用法.
#!/usr/bin/python
class A(object):
def foo(self,x):
print "executing foo(%s,%s)"%(self,x)
@classmethod
def class_foo(self,x):
print "executing class_foo(%s,%s)"%(self,x)
>>> A.class_foo(2)
executing class_foo(<class '__main__.A'>,2)
>>>
Run Code Online (Sandbox Code Playgroud)
使用self和cls只是一个命名约定.你可以随意打电话给他们(不要这样!).因此,你仍然传递类对象,你只是命名它self,而不是cls.
Python程序员的99.999%并不会在意你给他们打电话self和cls,也有很多的IDE会,如果你打电话给他们什么,但抱怨self和cls,因此请坚持下去的惯例.
我觉得最后一个答案只讨论了第一个参数的命名约定,而没有解释 self 对于所谓的静态方法与常规方法的评估结果。以下面的例子为例:
class A(object):
def x(self):
print(self)
@classmethod
def y(self):
print(self)
a = A()
b = A()
c = A()
print(a.x())
print(b.x())
print(c.x())
print()
print(a.y())
print(b.y())
print(c.y())
Run Code Online (Sandbox Code Playgroud)
输出如下:
<__main__.A object at 0x7fc95c4549d0>
None
<__main__.A object at 0x7fc95c454a10>
None
<__main__.A object at 0x7fc95c454a50>
None
()
<class '__main__.A'>
None
<class '__main__.A'>
None
<class '__main__.A'>
None
Run Code Online (Sandbox Code Playgroud)
请注意,这 3 个对象调用的方法x会产生不同的十六进制地址,这意味着该self对象与实例相关联。该y方法表明self实际上引用的是类本身而不是实例。这就是区别。