我正在尝试理解类方法。根据我的阅读,我们必须在定义时将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)
>>>
答案 0 :(得分:6)
使用self
和cls
只是一个命名约定。您可以随意打电话给他们(不要!)。因此,您仍在传递类对象,但您只是将其命名为self
,而不是cls
。
99.999%的Python程序员会希望你称他们为self
和cls
,如果除了self
和cls
之外你还会有很多IDE会抱怨他们,所以请坚持惯例。
答案 1 :(得分:3)
我觉得最后的答案只讨论了第一个参数的命名约定,而没有解释自我评估的静态方法与常规方法的对应关系。采取以下示例:
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())
输出如下:
<__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
请注意,3个对象调用的方法x
会产生不同的十六进制地址,这意味着self
对象与实例绑定。 y
方法显示self
实际上是引用类本身而不是实例。这就是区别。