Python-self、no-self和cls

Python-self、no-self和cls,python,class,object,self,Python,Class,Object,Self,还有一个关于“自我”的问题,如果你不使用“自我”和“cls”做什么会发生什么。 我“已经完成了我的家庭作业”,我只是想确保我都做完了 self-要访问对象的属性,需要在属性名称前面加上对象名称(objname.attributename)。使用相同的方法self访问对象(类)本身内部的属性。因此,如果在类方法中没有使用self作为变量的前缀,则无法在类的其他方法中或在类之外访问该变量。因此,如果您只想使变量成为该方法的局部变量,可以省略它。同样,如果您有一个方法,但没有任何要与其他方法共享的变量

还有一个关于“自我”的问题,如果你不使用“自我”和“cls”做什么会发生什么。 我“已经完成了我的家庭作业”,我只是想确保我都做完了

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
,如上例所示。刚开始学习时,请坚持使用普通实例方法。另请参见: