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

Pra*_*eep 6 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)
>>>
Run Code Online (Sandbox Code Playgroud)

Ffi*_*ydd 6

使用selfcls只是一个命名约定.你可以随意打电话给他们(不要这样!).因此,你仍然传递类对象,你只是命名它self,而不是cls.

Python程序员的99.999%并不会在意你给他们打电话selfcls,也有很多的IDE会,如果你打电话给他们什么,但抱怨selfcls,因此请坚持下去的惯例.


tip*_*ipu 3

我觉得最后一个答案只讨论了第一个参数的命名约定,而没有解释 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实际上引用的是类本身而不是实例。这就是区别。