通过()和没有括号创建对象实例的区别?
假设这是我的简单课程:
class ilist(list):
t1 = "Test1"
t2 = "Test2"
将实例设为这两个变量:
list1 = ilist()
list2 = ilist
打印两个实例时
>>> list1
[]
>>> list2
<class '__main__.ilist'>
我可以成功访问他们的属性
>>> list1.test1
'Test1'
>>> list2.test1
'Test1'
它使用方法追加
在list2中显示错误>>> list1.append("Item1")
>>> list2.append("Item1")
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
list2.append("Item1")
TypeError: descriptor 'append' requires a 'list' object but received a 'str'
不仅在这个简单的例子中有什么区别?
答案 0 :(得分:8)
list1 = ilist()
创建了该类的对象。 list2 = ilist
引用了类本身。类是Python中的第一类对象,这意味着它们可以像任何其他对象一样被分配。
因为属性是类的一部分,所以它们也是使用该类创建的对象的一部分。
答案 1 :(得分:2)
当你不打电话给班级时(省略()
),你不是在做实例。您正在创建对类的另一个引用。 ()
调用一个类来生成实例。
您的list2
变量仅仅是对ilist
类对象的引用。该类对象具有t1
和t1
属性,因此您可以引用它们。但只有list1
是通过调用类生成的实际实例。
在实例上查找属性时,也会查询类。因此list1
没有t1
和t2
属性,但其类。
您可能想再次咨询Python tutorial on classes以了解类和实例之间的区别。
答案 2 :(得分:2)
您没有在第二个示例中创建对象的实例。您只是将类ilist
分配给名为list2
的变量,这就是repr(list)
打印出其类名的原因。
答案 3 :(得分:1)
解释实际的错误消息:在第二个示例中调用相同的方法,但方法应该接收self
作为它们的第一个参数。如果使用实例进行调用,它将作为第一个参数传递;但是你在这里使用的是类,所以应该明确地传递它。
您正在传递"Item1"
作为第一个参数,但这是一个字符串,而不是ilist
。
答案 4 :(得分:0)
(差不多)所有内容都是python中的一个对象,因此list1 = ilist()
是ilist
类型的对象,ilist
和list2 = ilist
是type
类型的对象