Python中使用__init__与在类中直接定义变量有什么区别?
我刚开始学习Python,想更好地理解某些东西背后的逻辑。
为什么我会这样写(默认变量在__init__
里):
class Dawg:
def __init__(self):
self.previousWord = ""
self.root = DawgNode()
self.uncheckedNodes = []
self.minimizedNodes = {}
def insert( self, word ):
#...
def finish( self ):
#...
而不是这样:
class Dawg:
previousWord = ""
root = DawgNode()
uncheckedNodes = []
minimizedNodes = {}
def insert( self, word ):
#...
def finish( self ):
#...
我的意思是——为什么我需要使用__init__
呢?如果我可以直接把默认变量添加到类里,不也一样吗?
2 个回答
4
当你写这个:
class Dawg:
previousWord = ""
root = DawgNode()
uncheckedNodes = []
minimizedNodes = {}
这些不是实例变量,它们是类变量(意思是:所有这个类的实例共享同样的变量和相同的值)。另一方面,这个:
class Dawg:
def __init__(self):
self.previousWord = ""
self.root = DawgNode()
self.uncheckedNodes = []
self.minimizedNodes = {}
... 是在声明实例变量,这意味着每个类的实例都有不同的值。正如你所看到的,每段代码的意思完全不同,你需要选择适合你的那一个。提示:大多数情况下,你会对实例变量感兴趣,因为类变量定义了一种对象之间共享的全局状态,这可能会导致错误。
28
当你在一个类里创建变量时,这些变量就是类变量(它们对这个类的所有对象都是共享的)。而当你在 __init__
方法里用 self.variable_name = value
来初始化变量时,这些变量就是每个实例独有的,叫做实例变量。
举个例子,
class TestClass(object):
variable = 1
var_1, var_2 = TestClass(), TestClass()
print var_1.variable is var_2.variable
# True
print TestClass.variable is var_1.variable
# True
因为这个变量是类变量,所以使用 is
操作符时会返回 True
。但是,对于实例变量来说,
class TestClass(object):
def __init__(self, value):
self.variable = value
var_1, var_2 = TestClass(1), TestClass(2)
print var_1.variable is var_2.variable
# False
print TestClass.variable is var_1.variable
# AttributeError: type object 'TestClass' has no attribute 'variable'
你不能仅仅通过类名来访问实例变量。