3

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

假设这是我的简单课程:

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

并对这两个变量进行实例化:

list1 = ilist()
list2 = ilist

打印两个实例时

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

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

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

它使用方法 append 在 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'

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

4

5 回答 5

11

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

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

于 2013-06-04T21:51:17.900 回答
2

当你不调用类(省略())时,你没有创建实例。您正在创建对该类的另一个引用。()调用一个类来产生一个实例。

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

在查找实例的属性时,也会查询该类。solist1没有t1andt2属性,但它的类.

您可能想再次查阅关于类的 Python 教程,以了解类和实例之间的区别。

于 2013-06-04T21:50:27.417 回答
2

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

于 2013-06-04T21:50:34.880 回答
1

解释实际的错误消息:在第二个示例中调用了相同的方法,但方法应该接收self作为它们的第一个参数。如果您使用实例调用,它将作为第一个参数传递;但是在这里您正在使用该类,因此应该显式传递它。

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

于 2013-06-04T22:02:16.590 回答
0

(几乎)一切都是pythonlist1 = ilist()中的对象,类型对象也是如此ilistilist并且list2 = ilist是类型对象type

于 2013-06-04T21:57:06.330 回答