使用 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
不会影响 Test
的 cls_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
在下面的例子中 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
不会影响 Test
的 cls_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