这两种方法对新的python类实例有什么不同

时间:2013-07-01 09:41:56

标签: python

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

答案 0 :(得分: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仍然指向新创建的实例的类对象intead。

答案 1 :(得分:1)

函数 init 是该类的构造函数,除非您使用以下syntex,否则不会调用它:

    y = TestClass()

使用它,TestClass的对象(即y)具有所有属性。

答案 2 :(得分:0)

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

在第二个实例中,您正在创建一个实例(请注意TestClass之后的实质内容),因此访问变量的工作正如您所发现的那样

答案 3 :(得分:0)

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

x = TestClass

这会将类TestClass复制到x。

y = TestClass()

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

y = x()

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