1

我是python程序的新学习者,我对创建类实例感到困惑,如下所示,它们有什么不同?

类声明:

class TestClass:

    def __init__(self, one=10, two=20, three=30):
        self.one = one
        self.two = two
        self.three = three

第一个。(穿着)

x = TestClass
print x
print x(50)
print x.one, x.two

输出:

__main__.TestClass
<__main__.TestClass instance at 0x0000000002445208>
Traceback (most recent call last):
  File "D:\workspace-QATool_vNext\testStudyCode\test\StudyCode.py", line 27, in <module>
    print x.one, x.two
AttributeError: class TestClass has no attribute 'one'

第二。(正确的)

y = TestClass()
print y
print y.one, y.two

输出:

<__main__.TestClass instance at 0x00000000023B5208>
10 20
4

4 回答 4

4

第一个给你一个指向类对象的指针(是的,这些也是对象),第二个给你一个对象的实例。 __init__仅在您创建对象的新实例时调用。这就是()类之后所做的:创建一个新实例。

您可以通过以下方式使您的第一个示例工作:

x = TestClass #'x' points to class object
print x
z = x(50) #'x' still points to class object but 'z' points to new instance
print z
print z.one, z.two #and 'z' is now usable as a new instance
print x.one #where 'x' still points to the class object that does not know 'one' since it hasn't run '__init__'

问题是 x 仍然指向类对象而不是新创建的实例。

于 2013-07-01T09:45:15.057 回答
1

Function init是该类的构造函数,在您使用以下语法之前不会调用它:

    y = TestClass()

这样,TestClass 的对象(即 y)就具有所有属性。

于 2013-07-01T09:47:55.013 回答
0

在您的第一个示例中,您只是将类复制到x. 您根本没有创建实例,因此__init__构造函数不会运行。print x(50)是创建类实例的原因,因为您实际上是在调用该类。但是您没有将其存储在任何地方,因此毫无意义。

在第二个中,您正在创建一个实例(注意后面的括号TestClass),因此访问变量就像您发现的那样工作

于 2013-07-01T09:44:22.437 回答
0

您创建和使用 TestClass 对象的两次尝试之间存在非常细微的差异。

x = TestClass

这会将类 TestClass 复制到 x。

y = TestClass()

这将创建一个 testclass 实例并将其分配给 y。

y = x()

通过将 testclass 复制到 x,x 包含完全相同的类,因此也可以用于启动类 testclass 的对象。

于 2013-07-01T09:47:40.497 回答