python使用__init__ vs只是在类中定义变量 - 任何区别?

时间:2014-07-14 15:15:20

标签: python oop

我是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 个答案:

答案 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 = {}

...声明实例变量,意思是:每个类的实例的值都不同。如您所见,每个代码段都意味着完全不同的东西,您必须选择适合您的代码段。提示:大多数时候你对实例变量感兴趣,因为类变量为你的对象定义了一种共享的全局状态,这很容易出错。