2013-06-04 76 views
0

使用()和不使用括号创建对象实例的区别?使用圆括号创建对象python

假设这是我的简单的类:

class ilist(list): 
    t1 = "Test1" 
    t2 = "Test2" 

与制作实例来此两个变量:

list1 = ilist() 
list2 = ilist 

当打印两个实例

>>> list1 
[] 
>>> list2 
<class '__main__.ilist'> 

我可以成功访问他们的属性

>>> list1.test1 
'Test1' 
>>> list2.test1 
'Test1' 

,它体现在使用的方法列表2错误追加

>>> 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

只有其中一个创建实例, – jamylak

回答

7

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

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

2

当您不在调用该类(省略())时,您并未创建实例。您正在创建的另一个参考。 ()调用一个类来产生一个实例。

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

当在实例上查找属性时,该类请参考以及。所以list1不具有t1t2属性,但其类别确实是

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

2

您在第二个示例中未创建对象的实例。您只需将类ilist分配给名为list2的变量,这就是为什么repr(list)会输出其类名称的原因。

0

(几乎)一切都是在python一个对象,所以list1 = ilist()是类型的对象ilistilistlist2 = ilisttype

1

为了解释实际的错误消息类型的对象:同样的方法被称为第二例如,但方法应该收到self作为他们的第一个参数。如果您使用实例进行调用,它将作为第一个参数传递;但是在这里你使用的是类,所以它应该被明确地传递。

您通过"Item1"作为第一个参数,但这是一个字符串,而不是ilist