我是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
答案 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的对象。