Python - 自我,没有自我和cls

时间:2011-09-26 11:59:14

标签: python class object self

另一个关于'自我'是什么的问题,如果你不使用'自我'和什么是'cls'会发生什么。 我“完成了我的作业”,我只想确保自己完成所有工作。

self - 要访问对象的属性,您需要在属性名称前加上对象名称(objname.attributename)。同样的方式self用于访问内部的对象(类)本身。因此,如果您没有在类方法中使用self为变量添加前缀,那么您将无法在类的其他方法中或类外部访问该变量。因此,如果您只想将变量局部化为该方法,则可以省略它。同样的方法如果你有一个方法并且你没有想要与其他方法共享的任何变量,你可以省略方法参数中的self

cls - 每个实例都创建自己的属性“副本”,因此如果您希望类的所有实例共享同一个变量,那么您应该使用“cls为该变量名称添加前缀'在课堂宣言中。

这样可以吗?感谢。

2 个答案:

答案 0 :(得分:82)

  

以相同的方式使用self来访问对象(类)本身内的属性。

不在对象/类中,只在类'实例方法中。 self只是一个惯例,你可以随意调用它,即使每种方法都有不同的东西。

  

因此,如果您没有在类方法中使用self作为self的前缀,那么您将无法在类的其他方法中或类外部访问该变量。

self用于实例方法cls通常用于类方法。否则,正确。

  

因此,如果您只想将变量置于该方法的本地,则可以省略它。

是的,在一个方法中,变量名称就像在任何其他函数中一样 - 解释器在本地查找名称,然后在闭包中查找,然后在globals / module级别,然后在Python内置函数中查找。

  

同样的方法如果你有一个方法并且你没有想要与其他方法共享的任何变量,你可以从方法参数中省略self。

不,你不能只从方法参数中省略“self”。你必须告诉Python你想要一个staticmethod,它不会自动通过@staticmethod行上方的defmymethod = staticmethod(mymethod)传递类的实例,以太在方法体下面。

  

每个实例都创建它自己的属性“副本”,因此如果您希望类的所有实例共享同一个变量,您可以在类声明中使用“cls”作为变量名称的前缀。

类定义中,但在任何方法之外,名称都绑定到类 - 这就是你定义方法的方式等。你不要在它们前面添加cls或其他任何方法

cls通常用于__new__特殊staticmethodclassmethod中,与staticmethod s类似。这些方法只需要访问类,但不能访问特定于每个类实例的内容。

classmethod内,是的,您可以使用它来引用您希望所有类实例和类本身共享的属性。

self一样,cls只是一种惯例,您可以随意调用它。

一个简短的例子:

class Foo(object):

    # you couldn't use self. or cls. out here, they wouldn't mean anything

    # this is a class attribute
    thing = 'athing'

    def __init__(self, bar):
        # I want other methods called on this instance of Foo
        # to have access to bar, so I create an attribute of self
        # pointing to it
        self.bar = bar

    @staticmethod
    def default_foo():
        # static methods are often used as alternate constructors,
        # since they don't need access to any part of the class
        # if the method doesn't have anything at all to do with the class
        # just use a module level function
        return Foo('baz')

    @classmethod
    def two_things(cls):
        # can access class attributes, like thing
        # but not instance attributes, like bar
        print cls.thing, cls.thing

答案 1 :(得分:10)

您使用self作为常规方法中的第一个参数,其中实例通过此参数自动传递。因此无论方法中的第一个参数是什么 - 它指向当前的实例

当方法用@classmethod修饰时,它会将类作为第一个参数传递,因此最常见的名称为cls,因为它指向

你通常不会前缀任何变量(匈牙利表示法都不好)。


以下是一个例子:

class Test(object):
    def hello(self):
        print 'instance %r says hello' % self
    @classmethod
    def greet(cls):
        print 'class %r greet you' % cls

输出:

>>> Test().hello()
instance <__main__.Test object at 0x1f19650> says hello

>>> Test.greet()
class <class '__main__.Test'> greet you