使用 self 访问 Class 方法和变量

Access Class method and variable using self

在下面的例子中 Test class 有两个实例方法和一个 class 方法

set_cls_var_1 方法中,我使用 self.

设置了 class 变量

set_cls_var_2 方法中,我使用 self.

调用 class 方法
   class Test():

        #class variable
        cls_var = 10

        def __init__(self):
           obj_var=20

        def set_cls_var_1(self,val):
            #second method to access class variable
            print "first "
            self.cls_var = val

        def set_cls_var_2(self):
            print "second"
            self.task(200)

        @classmethod
        def task(cls,val):
            cls.cls_var = val


t=Test()

#set class variable by first method
t.set_cls_var_1(100)

print Test.cls_var

#set class variable by second method
t.set_cls_var_2()

print Test.cls_var

输出

first 
10
second
200

预期输出

first 
100
second
200

我的问题是: 为什么只有class方法可以自己调用,为什么class变量不能

像您一样定义测试 class 时,python 创建一个名为 Test 的 class 对象,它的属性 cls_var 等于 10。当您实例化此对象时class,创建的对象没有cls_var属性。当调用 self.cls_var 时,由于 python 解析属性的方式,实际上是检索 class' 属性。

但是当设置 self.cls_var 时,该值是在对象级别设置的!因此,进一步调用 self.cls_var 将为您提供对象属性的值,而不是 class'!

也许这段代码会让这个更清楚:

class A(object):
    a = 1
a = A()
print a.a  # prints 1
A.a = 2
print a.a  # prints 2

您会看到,即使在 class 级别设置值,更改也会在对象上重新执行,因为 python 将在 class 在对象级别找不到时。

当调用Test.cls_var时,它是您正在访问的class的cls_var属性!不是您刚刚修改的对象之一。

当您尝试使用 self 访问对象的属性时,Python 首先搜索对象的属性。如果在那里找不到它,则搜索对象的 class 的属性。这就是你的情况;

Python首先搜索t的属性。它找不到 cls_var,因此它会搜索 T class 的属性。它找到 cls_var 所以它停止,并且 returns cls_var 的值。

但是,在将属性分配给 self 时,Python 总是将它们直接分配给对象,而不是对象的 class,除非明确指示这样做。这就是为什么将 self.cls_var 分配给 100 不会影响 Testcls_var 属性。

我发现有些东西总是使用以下方式访问实例方法中的类方法或变量

class Test():
    #class variable
    cls_var = 10

    def __init__(self):
        obj_var=20

    def set_cls_var_1(self,val):
        #first method to access class variable
        print "first type"
        cls = self.__class__
        cls.cls_var = val



t=Test()
#set class variable by first method

t.set_cls_var_1(100)

print Test.cls_var