我一直在研究使用几个类的东西。现在,我的代码看起来像这样:
class name:
*docstrings and stuff*
var1=default_value1
var2=default_value2
def __init__(self):
self.var1=default_value1
self.var2=default_value2
我认为这不是必要的,我只能使用其中一个声明'块',但我不完全理解它是如何工作的。创建新对象时,默认应用类中定义的变量?如果是这样,那么这样做的优点是什么,而不是在构造函数中声明所有内容?
我不完全确定为什么要这样做,我必须从我在网上看到的一些例子中找到它(其余的是copypaste)。我正在审查我的代码,我想确保它有意义。
答案 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
将不同于BackOffice
到BackOffice
,因此我不会将其声明为类变量而是实例变量。
如果我想编写一个返回商店列表的所有寄存器的实用程序,这可能会有所帮助:
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指出的那样,类变量不是我想象的类实例的默认值,因此在类级别中定义变量不会生成这些变量,并且在构造该类的对象期间将它们默认为所述值。因此,根本不需要构造函数之前的变量语句。
我并不完全知道这种误解来自何处,但这正是我需要知道的。在阅读在线教程时,请务必仔细检查。