我是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__
- >如果我可以直接将默认变量直接添加到类中?
答案 0 :(得分:12)
当您在类中创建变量时,它们是类变量(它们对于类的所有对象都是通用的),当您使用__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'
并且您无法仅使用类名访问实例变量。
答案 1 :(得分:2)
当你这样写:
class Dawg:
previousWord = ""
root = DawgNode()
uncheckedNodes = []
minimizedNodes = {}
那些不是实例变量,它们是类变量(意思是:在类的所有实例之间共享具有相同值的相同变量。)另一方面,这个:
class Dawg:
def __init__(self):
self.previousWord = ""
self.root = DawgNode()
self.uncheckedNodes = []
self.minimizedNodes = {}
...声明实例变量,意思是:每个类的实例的值都不同。如您所见,每个代码段都意味着完全不同的东西,您必须选择适合您的代码段。提示:大多数时候你对实例变量感兴趣,因为类变量为你的对象定义了一种共享的全局状态,这很容易出错。