【零基础向】关于class内的全局变量赋值
本帖最后由 xiaofan1228 于 2020-3-19 10:43 编辑首先有了一个animal的class
class Animal():
def __init__(self, age):
self.age = age
def get_age(self):
return self.age
def set_name(self, name):
self.name = name
def get_name(self):
try:
return self.name
except:
print("Set name first!")
def __str__(self):
return self.name + ":" + str(self.age)
__repr__ = __str__
在此基础上我想做一个Rabbitclass,想要创建一个计数变量,每次创建一个新的Rabbit计数器 +1
class Rabbit(Animal):
tag = 1
def __init__(self, age, parent1=None, parent2=None):
Animal.__init__(self, age)
self.parent1 = parent1
self.parent2 = parent2
self.rid = Rabbit.tag
Rabbit.tag += 1
这里有个问题,Rabbit.tag 自然是调用类变量的方法, 但是tag =1 是不在类的方法和初始化里面的。也就是说其本质就是个全局变量,既然如此就可以把他用全局变量表示
class Rabbit(Animal):
global tag
tag = 1
def __init__(self, age, parent1=None, parent2=None):
Animal.__init__(self, age)
self.parent1 = parent1
self.parent2 = parent2
self.rid = tag
tag += 1
但是上面报错了,原因是
self.rid = tag
UnboundLocalError: local variable 'tag' referenced before assignment
tag依然是个local variable,已经声明了global了为什么又变成了local?因为在类里面?
另,如果调用类变量tag一定要Rabbit.tag 那为什么一开始的tag = 1 不是Rabbit.tag = 1?试了一下报错了
Rabbit.tag = 1
NameError: name 'Rabbit' is not defined
也就是说这里的Rabbit.tag 和tag不是一个概念对吗? Rabbit.tag 是实例化后的tag,和类计数器本身不再有关系了?
我觉得吧,这个问题不应该发在新手乐园{:10_277:} 你说的计数用的应该是静态变量,直接用类名调用,全局变量不能在类或者函数中声明,只是在类或者函数中使用的时候前面加上global关键字。
#!/usr/bin/python3
tag=1
class Animal():
def __init__(self, age):
self.age = age
def get_age(self):
return self.age
def set_name(self, name):
self.name = name
def get_name(self):
try:
return self.name
except:
print("Set name first!")
def __repr__(self):
return self.name + ":" + str(self.age)
class Rabbit(Animal):
stc_attr=0
def __init__(self, age, parent1=None, parent2=None):
global tag
Animal.__init__(self, age)
self.parent1 = parent1
self.parent2 = parent2
self.rid = tag
Rabbit.stc_attr+=1
print('tag:%d'%tag)
print('stc_attr:%d'%Rabbit.stc_attr)
tag += 1
a1=Rabbit(1,'aa','aaa')
a2=Rabbit(2,'bb','bb') sunrise085 发表于 2020-3-19 11:53
你说的计数用的应该是静态变量,直接用类名调用,全局变量不能在类或者函数中声明,只是在类或者函数中使用 ...
我其实是想用tag来兼顾 stc_attr的功能,
“全局变量不能在类或者函数中声明”,但是你还是把它放进了 __init__方法里,这个不太理解 xiaofan1228 发表于 2020-3-19 12:14
我其实是想用tag来兼顾 stc_attr的功能,
“全局变量不能在类或者函数中声明”,但是你还是把它放进了 ...
那不是在__init__函数中声明,而是为了在函数内使用全局变量,所以加上global关键字。tag的声明在类外面,你看第二行。
页:
[1]