【问题标题】:Can I pass self as the first argument for class methods in python我可以将self作为python中类方法的第一个参数传递吗
【发布时间】:2014-11-28 10:09:49
【问题描述】:

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

【问题讨论】:

    标签: python


    【解决方案1】:

    selfcls 的使用只是一种命名约定。您可以随意称呼它们(不要这样!)。因此,您仍在传递类对象,只是将其命名为 self,而不是 cls

    99.999% 的 Python 程序员会期望您称呼他们为 selfcls,如果您称呼他们为 selfcls 之外的任何名称,很多 IDE 也会抱怨,所以请坚持公约。

    【讨论】:

    • 谢谢,有道理。
    【解决方案2】:

    我觉得最后一个答案只讨论了第一个参数的命名约定,而没有解释所谓的静态方法与常规方法的自我评估。举个例子:

    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 实际上是在引用类本身而不是实例。这就是区别。

    【讨论】:

    • 顺便说一句,这不是静态方法。静态方法用@staticmethod 装饰,与“普通”方法(我认为通常称为实例方法)不同。
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2014-08-26
    • 2020-09-25
    • 2012-12-28
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多