Python中使用__init__与在类中直接定义变量有什么区别?

18 投票
2 回答
5878 浏览
提问于 2025-04-18 13:16

我刚开始学习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'

你不能仅仅通过类名来访问实例变量。

撰写回答