巨蟒-自我,没有自我和 cls

还有一个关于“自我”是用来做什么的问题,如果你不用“自我”会发生什么,以及“ cls”是用来做什么的。 I "have done my homework", I just want to make sure I got it all.

要访问对象的属性,需要在属性名前加上对象名(objname.attributename)。与使用 self访问对象(类)本身的属性 在里面的方法相同。因此,如果在类方法中没有以 self 作为变量的前缀,就无法在类的其他方法中或类之外访问该变量。因此,如果希望使变量仅局部于该方法,可以省略它。同样,如果您有一个方法,并且没有任何变量要与其他方法共享,那么可以从方法参数中省略 self

cls-每个实例创建它自己的属性的“副本”,所以如果你想让一个类的所有实例共享同一个变量,你可以在类声明中用“ cls”作为变量名的前缀。

Is this all right? Thanks.

80429 次浏览

在常规方法中使用 self作为第一个参数,其中实例通过该参数自动传递。所以无论方法中的第一个参数是什么它都指向当前的 例子

当一个方法用 @classmethod修饰时,它获得作为第一个参数传递的类,因此它最常用的名称是 cls,因为它指向 同学们

你通常没有 ABc0任何变量(匈牙利命名法是不好的)。


这里有一个例子:

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

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

不在对象/类中,而是在类的 instance methods中。self只是一个约定,你可以随心所欲地调用它,甚至在每个方法中都有不同的东西。

因此,如果在类方法中没有以 self 作为变量的前缀,就无法在类的其他方法中或类之外访问该变量。

实例方法中使用 self,在 类方法中经常使用 cls。否则,正确。

因此,如果希望使变量仅局部于该方法,可以省略它。

是的,在方法内部,变量名与其他任何函数内部的名称类似——解释器在本地查找名称,然后在闭包中查找,然后在全局/模块级别中查找,然后在 Python 内置函数中查找。

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

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

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

类定义内部,但在任何方法之外,名称都绑定到类——这就是定义方法的方式等等。你不要在它们前面加上 cls或者其他什么前缀。

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

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

self一样,cls只是一个约定,你可以随便叫它什么。

A brief example:

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