class my_class():
args1=1
def fun(self):
print self.args1
my_c=my_class()
my_c.fun()
请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?
class my_class():
args1=1
def fun(self):
print self.args1
my_c=my_class()
my_c.fun()
请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?
类变量,这个可以通过直接打印类对象的id和用self限制的对象id是否相同来验证,类的地址和对象id是一样的,之所以可用self,是因为python默认先查找实例变量,找不到再找类变量,所以表面上看是对象变量,但实际上引用的是类变量。
class MyClass:
args1 = 1
def fun(self):
print id(self.args1)
my_c = MyClass()
print id(MyClass.args1)
my_c.fun()
如果看的再深一点的话,实际上,这里的self只是表示绑定的对象,你讲其命名为其他的变量名也是可以的
class MyClass:
args1 = 1
def fun(binding): #这里用的是binding,而不是self
print id(binding.args1)
my_c = MyClass()
print id(MyClass.args1)
my_c.fun()
class myclass():
args = 1
def fun(self):
print self.args
self.__class__.args += 1
if __name__ == '__main__':
m1 = myclass()
m1.fun()
m2 = myclass()
m2.fun()
结果为
1
2
明显是类变量
self.args1
这是实例变量。my_class.args1
这是类变量。
class my_class():
args1=1
def fun(self):
print self.args1 #这是实例变量
print my_class.args1 #这是类变量
2 回答4.9k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
3 回答1k 阅读✓ 已解决
4 回答822 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.6k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
如果搞明白了 类空间和实例空间,这个问题就很简单了。类有自己的名字空间,可以通过
className.__dict__
查看得到里面的内容。 同样实例化一个实例的话, 那么这个实例也就有了自己的名字空间,用来存储实例的成员,方法等。当然一个实例肯定可以共享类的成员的。具体对你的case来说,如果
print self.args1
, 首先会在实例的名字空间内部查找, 没有发现args1
这个成员,于是继续向上找到类的空间,发现有了args1,这样就会输出类的args1. 但是如果有赋值语句的话,比如self.args1 = 1
, 那么实例就会在自己空间创建了args1这个成员。 看下面的代码:结合上面的代码,应该可以从相对本质上理解了