使用括号python创建对象

时间:2013-06-04 21:49:04

标签: python python-3.x

通过()和没有括号创建对象实例的区别?

假设这是我的简单课程:

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'

不仅在这个简单的例子中有什么区别?

5 个答案:

答案 0 :(得分:8)

list1 = ilist()创建了该类的对象。 list2 = ilist引用了类本身。类是Python中的第一类对象,这意味着它们可以像任何其他对象一样被分配。

因为属性是类的一部分,所以它们也是使用该类创建的对象的一部分。

答案 1 :(得分:2)

当你不打电话给班级时(省略()),你不是在做实例。您正在创建对的另一个引用。 ()调用一个类来生成实例。

您的list2变量仅仅是对ilist类对象的引用。该类对象具有t1t1属性,因此您可以引用它们。但只有list1是通过调用类生成的实际实例。

在实例上查找属性时,也会查询。因此list1没有t1t2属性,但其

您可能想再次咨询Python tutorial on classes以了解类和实例之间的区别。

答案 2 :(得分:2)

您没有在第二个示例中创建对象的实例。您只是将类ilist分配给名为list2的变量,这就是repr(list)打印出其类名的原因。

答案 3 :(得分:1)

解释实际的错误消息:在第二个示例中调用相同的方法,但方法应该接收self作为它们的第一个参数。如果使用实例进行调用,它将作为第一个参数传递;但是你在这里使用的是类,所以应该明确地传递它。

您正在传递"Item1"作为第一个参数,但这是一个字符串,而不是ilist

答案 4 :(得分:0)

(差不多)所有内容都是python中的一个对象,因此list1 = ilist()ilist类型的对象,ilistlist2 = ilisttype类型的对象