鱼C论坛

 找回密码
 立即注册
查看: 2634|回复: 4

[已解决]【零基础向】关于class内的全局变量赋值

[复制链接]
发表于 2020-3-19 10:41:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 xiaofan1228 于 2020-3-19 10:43 编辑

首先有了一个animal的class
  1. class Animal():
  2.     def __init__(self, age):
  3.         self.age = age

  4.     def get_age(self):
  5.         return self.age

  6.     def set_name(self, name):
  7.         self.name = name

  8.     def get_name(self):
  9.         try:
  10.             return self.name
  11.         except:
  12.             print("Set name first!")

  13.     def __str__(self):
  14.         return self.name + ":" + str(self.age)

  15.     __repr__ = __str__
复制代码


在此基础上我想做一个Rabbit  class,想要创建一个计数变量,每次创建一个新的Rabbit计数器 +1

  1. class Rabbit(Animal):
  2.     tag = 1

  3.     def __init__(self, age, parent1=None, parent2=None):
  4.         Animal.__init__(self, age)
  5.         self.parent1 = parent1
  6.         self.parent2 = parent2
  7.         self.rid = Rabbit.tag
  8.         Rabbit.tag += 1
复制代码



这里有个问题,Rabbit.tag 自然是调用类变量的方法, 但是tag =1 是不在类的方法和初始化里面的。也就是说其本质就是个全局变量,既然如此就可以把他用全局变量表示
  1. class Rabbit(Animal):
  2.     global tag
  3.     tag = 1

  4.     def __init__(self, age, parent1=None, parent2=None):
  5.         Animal.__init__(self, age)
  6.         self.parent1 = parent1
  7.         self.parent2 = parent2
  8.         self.rid = tag
  9.         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,和类计数器本身不再有关系了?
最佳答案
2020-3-19 12:57:26
xiaofan1228 发表于 2020-3-19 12:14
我其实是想用tag来兼顾 stc_attr的功能,

“全局变量不能在类或者函数中声明”,但是你还是把它放进了 ...

那不是在__init__函数中声明,而是为了在函数内使用全局变量,所以加上global关键字。tag的声明在类外面,你看第二行。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-19 10:50:15 | 显示全部楼层
我觉得吧,这个问题不应该发在新手乐园
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 11:53:47 | 显示全部楼层
你说的计数用的应该是静态变量,直接用类名调用,全局变量不能在类或者函数中声明,只是在类或者函数中使用的时候前面加上global关键字。
  1. #!/usr/bin/python3
  2. tag=1
  3. class Animal():
  4.     def __init__(self, age):
  5.         self.age = age
  6.     def get_age(self):
  7.         return self.age
  8.     def set_name(self, name):
  9.         self.name = name
  10.     def get_name(self):
  11.         try:
  12.             return self.name
  13.         except:
  14.             print("Set name first!")
  15.     def __repr__(self):
  16.         return self.name + ":" + str(self.age)

  17. class Rabbit(Animal):
  18.     stc_attr=0
  19.     def __init__(self, age, parent1=None, parent2=None):
  20.         global tag
  21.         Animal.__init__(self, age)
  22.         self.parent1 = parent1
  23.         self.parent2 = parent2
  24.         self.rid = tag
  25.         Rabbit.stc_attr+=1
  26.         print('tag:%d'%tag)
  27.         print('stc_attr:%d'%Rabbit.stc_attr)
  28.         tag += 1
  29. a1=Rabbit(1,'aa','aaa')
  30. a2=Rabbit(2,'bb','bb')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 12:14:18 | 显示全部楼层
sunrise085 发表于 2020-3-19 11:53
你说的计数用的应该是静态变量,直接用类名调用,全局变量不能在类或者函数中声明,只是在类或者函数中使用 ...

我其实是想用tag来兼顾 stc_attr的功能,

“全局变量不能在类或者函数中声明”,但是你还是把它放进了 __init__方法里,这个不太理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 12:57:26 | 显示全部楼层    本楼为最佳答案   
xiaofan1228 发表于 2020-3-19 12:14
我其实是想用tag来兼顾 stc_attr的功能,

“全局变量不能在类或者函数中声明”,但是你还是把它放进了 ...

那不是在__init__函数中声明,而是为了在函数内使用全局变量,所以加上global关键字。tag的声明在类外面,你看第二行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表