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