【发布时间】:2015-02-19 09:29:14
【问题描述】:
我发现有些类包含 __init__ 函数,有些则没有。我对下面描述的事情感到困惑。
这两段代码有什么区别:
class Test1(object):
i = 1
和
class Test2(object):
def __init__(self):
self.i = 1
我知道这两个类创建的结果或任何实例以及获取它们的实例变量的方式几乎相同。但是当我们没有为一个类定义 __init__ 函数时,是否有任何一种 Python 的“默认”或“隐藏”初始化机制?以及为什么我不能这样写第一个代码:
class Test1(object):
self.i = 1
这是我的问题。非常感谢!
非常感谢安蒂·哈帕拉!你的回答让我对我的问题有了进一步的理解。现在,我明白它们的不同之处在于一个是“类变量”,另一个是“实例变量”。但是,当我进一步尝试时,我又遇到了另一个令人困惑的问题。
就是这样。我创建了 2 个新类来理解您所说的:
class Test3(object):
class_variable = [1]
def __init__(self):
self.instance_variable = [2]
class Test4(object):
class_variable = 1
def __init__(self):
self.instance_variable = 2
正如您在回答我的第一个问题时所说,我了解 class_variable 是类通用的“类变量”,应该通过引用内存中的相同位置。 instance_variable 会针对不同的实例单独创建。
但正如我所尝试的,您所说的对于 Test3 的实例是正确的,它们都共享相同的内存。如果我在一个实例中更改它,无论我调用它,它的值都会改变。
但对于 Test4 的实例,情况并非如此。 Test4类中的int不也应该通过引用来改变吗?
i1 = Test3()
i2 = Test3()
>>> i1.i.append(2)
>>> i2.i
[1, 2]
j1 = Test4()
j2 = Test4()
>>> j1.i = 3
>>> j2.i
1
这是为什么呢?默认情况下,“=”会创建一个名为“i”的“instance variable”而不更改原始“Test4.i”吗?然而“append”方法只处理“class variable”?
再次感谢您对 Python 新手最无聊的基本概念的详尽解释。我真的很感激!
【问题讨论】:
-
在为每两个类创建两个实例之间尝试
Test1.i += 100和Test2.i += 100 -
那行不通,@PadraicCunningham;后者会说
AttributeError -
@AnttiHaapala,这就是我的意思,你需要创建一个实例,即
Test2().i += 100 -
我的意思是它作为演示也不是很好。
标签: python class initialization