Python-self、no-self和cls
还有一个关于“自我”的问题,如果你不使用“自我”和“cls”做什么会发生什么。 我“已经完成了我的家庭作业”,我只是想确保我都做完了Python-self、no-self和cls,python,class,object,self,Python,Class,Object,Self,还有一个关于“自我”的问题,如果你不使用“自我”和“cls”做什么会发生什么。 我“已经完成了我的家庭作业”,我只是想确保我都做完了 self-要访问对象的属性,需要在属性名称前面加上对象名称(objname.attributename)。使用相同的方法self访问对象(类)本身内部的属性。因此,如果在类方法中没有使用self作为变量的前缀,则无法在类的其他方法中或在类之外访问该变量。因此,如果您只想使变量成为该方法的局部变量,可以省略它。同样,如果您有一个方法,但没有任何要与其他方法共享的变量
self
-要访问对象的属性,需要在属性名称前面加上对象名称(objname.attributename
)。使用相同的方法self
访问对象(类)本身内部的属性。因此,如果在类方法中没有使用self作为变量的前缀,则无法在类的其他方法中或在类之外访问该变量。因此,如果您只想使变量成为该方法的局部变量,可以省略它。同样,如果您有一个方法,但没有任何要与其他方法共享的变量,则可以从方法参数中省略self
cls
-每个实例都创建自己的属性“副本”,因此,如果您希望一个类的所有实例共享同一个变量,您可以在类声明中用“cls
”作为该变量名的前缀
这样行吗?谢谢。您使用
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
>>Test().hello()
实例说你好
>>>Test.greet()
同学们好
self用于访问对象(类)本身内部的属性的方式相同
不是在对象/类内部,而是在类的实例方法内部self
只是一种约定,您可以随意调用它,甚至每个方法中都有不同的东西
因此,如果在类方法中没有使用self作为变量的前缀,则无法在类的其他方法中或在类之外访问该变量
self
用于实例方法,cls
常用于类方法。否则,请更正
因此,如果您只想使变量成为该方法的局部变量,可以省略它
是的,在一个方法中,变量名就像在任何其他函数中一样——解释器在本地查找该名称,然后在闭包中,然后在全局/模块级别,然后在Python内置中查找
同样,如果您有一个方法,但没有任何要与其他方法共享的变量,则可以从方法参数中省略self
不,不能只从方法参数中省略“self”。您必须告诉Python您想要一个staticmethod
,它不会自动通过类的实例,方法是在def
行上方执行@staticmethod
,或者在方法体下方执行mymethod=staticmethod(mymethod)
每个实例都创建自己的属性“副本”,因此,如果您希望一个类的所有实例共享同一个变量,则可以在类声明中将该变量名前缀为“cls”
在类定义内部,但在任何方法外部,名称都绑定到类——这就是定义方法等的方式。您不会在它们前面加cls
或任何其他前缀
cls
通常用于\uuuu new\uuuu
特殊的staticmethod
,或在classmethod
s中使用,这与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
匈牙利记法还不错。这是邪恶的。我的前缀是指“self.myvariable”。对不起,如果我不明白的话,我想这并不能回答我的问题,至少不能回答所有的问题。我想我会养成对那些绝对的、没有争议的答案投反对票的习惯。有两种匈牙利符号;在这里阅读更多内容:如果您真的想了解这类内容,并且已经阅读了一两篇Python教程,并阅读了
classmethod
,staticmethod
等上的文档,那么请阅读参考页.Hm,因此,如果您不希望实例访问静态方法,也不希望它访问其他方法,请使用静态方法;如果您希望在类实例之间共享,请使用类方法?“不希望实例访问静态方法”不,实例仍然可以访问静态方法,就像您可以从类外部访问静态方法一样,它只是不能访问实例上的其他方法,或者它的属性。在静态方法中可以执行的任何操作都可以在类外的普通函数中执行——如果希望明确它与类的其余部分相关,请将其设置为静态方法。如果不需要访问实例特有的内容,请使用类方法--bar
,如上例所示。刚开始学习时,请坚持使用普通实例方法。另请参见: