我可以将self作为python中类方法的第一个参数传递

时间:2014-11-28 10:09:49

标签: python

我正在尝试理解类方法。根据我的阅读,我们必须在定义时将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)
>>>

2 个答案:

答案 0 :(得分:6)

使用selfcls只是一个命名约定。您可以随意打电话给他们(不要!)。因此,您仍在传递类对象,但您只是将其命名为self,而不是cls

99.999%的Python程序员会希望你称他们为selfcls,如果除了selfcls之外你还会有很多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实际上是引用类本身而不是实例。这就是区别。