我需要两次声明类变量吗?

时间:2014-05-05 23:38:46

标签: python class variables python-2.7

我一直在研究使用几个类的东西。现在,我的代码看起来像这样:

class name:
  *docstrings and stuff*
  var1=default_value1
  var2=default_value2
  def __init__(self):
    self.var1=default_value1
    self.var2=default_value2  

我认为这不是必要的,我只能使用其中一个声明'块',但我不完全理解它是如何工作的。创建新对象时,默认应用类中定义的变量?如果是这样,那么这样做的优点是什么,而不是在构造函数中声明所有内容?

我不完全确定为什么要这样做,我必须从我在网上看到的一些例子中找到它(其余的是copypaste)。我正在审查我的代码,我想确保它有意义。

2 个答案:

答案 0 :(得分:0)

如果变量是类变量(而不是实例变量),则不需要在__init__内定义它。我不确定你在这种情况下到底想要完成什么,所以很难确切地说如何最好地构建代码。

作为一个例子,我为我的公司写了一个小模块来帮助我编写访问各种机器的脚本。我为零售商工作,所以我们通常有两种“类型”的系统:“后台”计算机和“注册”计算机。

class Machine(object):
    def __init__(self,store):
        self.store = store

class Register(Machine):
    type_ = "Register"
    def __init__(self,store,reg_num):
        super().__init__(self,store)
        self.number = reg_num
        self.IP = # IP address based on store and register number

class BackOffice(Machine)
    type_ = "Back Office"
    def __init__(self,store):
        super().__init__(self,store)
        self.IP = # IP address based on store

type_变量是一个类变量。 BackOffice("1")可以指代商店#1的后台计算机和BackOffice("1").type_ == "Back Office"。但是,IP将不同于BackOfficeBackOffice,因此我不会将其声明为类变量而是实例变量。

如果我想编写一个返回商店列表的所有寄存器的实用程序,这可能会有所帮助:

def listRegisters(storelist):
    stores = makestorelist(storelist) # a separate function that builds
                                      # stores and all their devices
    return [machine for store in stores for 
           machine in store.devices if machine.type_ == "Register]

当然我也可以做if isinstance(machine, Register),但这不是重点。

答案 1 :(得分:0)

正如user2357112指出的那样,类变量不是我想象的类实例的默认值,因此在类级别中定义变量不会生成这些变量,并且在构造该类的对象期间将它们默认为所述值。因此,根本不需要构造函数之前的变量语句。

我并不完全知道这种误解来自何处,但这正是我需要知道的。在阅读在线教程时,请务必仔细检查。