Python – 自我,没有自我和cls

还有一个问题是关于“自我”是什么,如果你不使用“自我”和“什么”,会发生什么。 我“已经完成了我的功课”,我只是想确定一切。

self – 要访问对象的属性,需要在属性名称前添加对象名称( objname.attributename )。 self用于访问对象(class)本身内部的属性。 所以,如果你没有在类方法中用自variables前缀一个variables,你将无法在类的其他方法或类之外访问该variables。 所以你可以省略它,如果你想使variables局部于该方法而已。 同样的方法,如果你有一个方法,你没有任何你想与其他方法共享的variables,你可以从方法参数中省略self

每个实例创build它自己的属性“复制”,所以如果你想要一个类的所有实例共享相同的variables,你可以在类声明中用' cls '作为variables名的前缀。

这样好吗? 谢谢。

self用于访问对象(class)本身内部的属性。

不在对象/类中,只在类的实例方法内self只是一个惯例,你可以把它称之为任何你想要的,甚至在每种方法中都有所不同。

所以,如果你没有在类方法中用自variables前缀一个variables,你将无法在类的其他方法或类之外访问该variables。

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

所以你可以省略它,如果你想使variables局部于该方法而已。

是的,在一个方法里,一个variables名就像其他任何函数一样 – 解释器在本地寻找名字,然后在闭包中,然后在全局variables/模块级中,然后在Python内置函数中查找。

同样的方法,如果你有一个方法,你没有任何你想与其他方法共享的variables,你可以从方法参数中省略自己。

不,你不能只从方法参数中省略“自我”。 你必须告诉Python你想要一个staticmethod ,它不会自动地通过类的实例,通过在def行之上执行@staticmethod ,或者在方法体之下执行mymethod = staticmethod(mymethod)

每个实例创build它自己的属性“复制”,所以如果你想要一个类的所有实例共享相同的variables,你可以在类声明中用'cls'作为variables名的前缀。

类定义里面,但是在任何方法之外,名字都是绑定到类的 – 这就是你如何定义方法的方式等等。你不要用cls或其他的东西来加前缀。

cls通常用在__new__特殊的staticmethod ,或者在classmethod ,这与staticmethod类似。 这些方法只需要访问类,而不是每个类的实例特定的东西。

在一个classmethod里面,是的,你可以用这个来引用你想要的类的所有实例和类本身的属性,以便共享。

self一样, cls只是一个惯例,你可以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 

在实例通过这个参数自动传递的常规方法中,您使用self作为第一个参数。 所以无论第一个参数在方法中 – 它指向当前的实例

当一个方法用@classmethod装饰时,它获得了作为第一个parameter passing的类,所以最常用的名字是cls因为它指向了

你通常不加任何variables的前缀 (匈牙利符号是坏的)。


这是一个例子:

 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