在下面的示例中,测试类有两个实例方法和一个classmethod
在 set_cls_var_1 方法中,我使用self设置类变量。
在 set_cls_var_2 方法中,我使用self调用类方法。
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
我的问题是: 为什么只有classmethod可以自己调用,为什么不是类变量
答案 0 :(得分:5)
当您尝试使用self
访问对象的属性时,Python首先搜索对象的属性。如果在那里找不到它,则搜索对象的类的属性。这就是你的情况;
Python首先搜索t
的属性。它找不到cls_var
,因此它会搜索T
类的属性。它会找到cls_var
,因此会停止,并返回cls_var
的值。
但是,在为self
分配属性时,Python总是将它们直接分配给对象,而不是对象的类,除非明确告知它这样做。这就是为self.cls_var
100
分配Test
不会影响cls_var
的{{1}} attrbiute。
答案 1 :(得分:1)
在定义Test类时,python创建一个名为Test的类对象,其属性cls_var
等于10.当您实例化此类时,创建的对象没有cls_var
属性。当调用self.cls_var
时,由于python解析属性的方式,它实际上是检索的类'属性。
但是当设置self.cls_var
时,该值设置在对象级别!因此,进一步调用self.cls_var
将为您提供对象属性的值,而不再是类'!
也许这段代码会让这个更清晰:
class A(object):
a = 1
a = A()
print a.a # prints 1
A.a = 2
print a.a # prints 2
您会看到,即使在类级别设置值时,也会对对象重新进行更改,因为,如果在对象级别找不到该属性,python将在该类中查找该属性。
调用Test.cls_var
时,它是您正在访问的类的cls_var
属性!不是您刚刚修改的对象之一。
答案 2 :(得分:1)
我发现其他一些总是使用以下方式来访问实例方法
中的classmethod或变量的东西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