xiaofan1228 发表于 2020-3-19 10:41:58

【零基础向】关于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,和类计数器本身不再有关系了?

墨羽岚 发表于 2020-3-19 10:50:15

我觉得吧,这个问题不应该发在新手乐园{:10_277:}

sunrise085 发表于 2020-3-19 11:53:47

你说的计数用的应该是静态变量,直接用类名调用,全局变量不能在类或者函数中声明,只是在类或者函数中使用的时候前面加上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')

xiaofan1228 发表于 2020-3-19 12:14:18

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

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

“全局变量不能在类或者函数中声明”,但是你还是把它放进了 __init__方法里,这个不太理解

sunrise085 发表于 2020-3-19 12:57:26

xiaofan1228 发表于 2020-3-19 12:14
我其实是想用tag来兼顾 stc_attr的功能,

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

那不是在__init__函数中声明,而是为了在函数内使用全局变量,所以加上global关键字。tag的声明在类外面,你看第二行。
页: [1]
查看完整版本: 【零基础向】关于class内的全局变量赋值