我刚开始学习Python。我发现类型系统有点难以理解。我有很多问题,但主要是长话短说; documentation州:
“Python程序中的所有数据都由对象表示......每个 object有一个标识,一个类型和一个值。“
没问题。但除此之外,它还没有真正描述“对象”是什么。例如,文档甚至没有涵盖这些“对象”支持点运算符 - 从我的PoV中,它们可能是内存数据结构中的某些内容,而不是id()
,type()
之外的用户。我收集的是一些基础元对象界面,类似于文档中class instance类型对象所描述的界面。从一个例子开始:
如果我在类实例“x”上执行此操作:
x.__class__.__name__
我得到了它的类的名字。我明白那个。该文档描述了类实例和类类型对象的__class__
和__name__
属性。如果我这样做[].__class__.__name__
我会得到“列表”。同样地,int(1).__class__.__name__
给出“int”。它对我来说是模棱两可的,我想澄清一下。所以我的问题是:
答案 0 :(得分:8)
我先回答1,2问题,然后回答第4个问题,然后回答第3个问题:
它们是相同的,是的,它们共享一个通用的API。当documentation将内置类型描述为"对象",或将类实例描述为"对象",或将类或其他任何内容描述为"对象" ......他们正在谈论完全相同的语言结构。
该对象是Python中的基础语言特性,与其他OOPL一样,支持属性和行为。所有Python对象都有一个类很像其他基于类的OOPL。 object
类是Python中类层次结构的基础。因此,所有类都是object
类的子类,而 all 前面提到的"对象"和object
的实例 - 通过继承。
值得首先明确指出在Python(2.2及以上版本)"类型"和"班" mean the same thing(用于所有密集目的)。所以" int"和其他所谓的内置类型都是类(当然它们表示为对象)。例如,x = int(1)
调用int
类(对象)来构造一个int实例对象x。
可以说Python中有两种类型的对象; "类型"对象,或代表类型的对象,以及"非类型"物品 - 那些没有的东西。但是,有两种类型的整数同样如此;零,而不是零。它并不意味着什么:Python中的所有东西都是包含类的对象。由于类形成种对象,因此它们都是名为" type"的类的实例。 type对象也是type的实例。请注意,您可以通过检查类对象的__bases__属性来检查类的继承层次结构。在所有情况下,它都会回到object
课程 - 当然。有关详细信息,请参阅http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html。
嗯,这实际上是一个很好的问题。它应该在Data Model的language reference部分中介绍,但它有点被撇去。对象对象(有意义)的构造函数是内置的,并与其余的内置here一起记录。 Classes chapter的The Python Tutorial也覆盖了这个区域。
答案 1 :(得分:1)
有点难以理解你在问什么。
类型是类的类。像Python中的其他所有类一样,类本身就是对象,你可以传递它们,将它们分配给变量等。如果你问一个类是什么类,你将得到答案type
。如果你问一个类实例它的类是什么,你当然会得到这个类。
>>> type(int)
<type 'type'>
>>> type(1)
<type 'int'>
>>> class Foo(object):
... pass
>>> type(Foo)
<type 'type'>
>>> obj = Foo()
>>> type(obj)
<class '__main__.Foo'>
(此处功能 type(x)
是执行x.__class__
的另一种方式。)
答案 2 :(得分:1)
Python类型就像普通对象一样(一切都是对象)。作为一个类型或一个实例是对象的语义问题,它扮演的角色。
类或类型是一个对象,它包含有关如何构造某种对象以及该类对象可以执行的操作的信息。
在Python 3中,类和类型基本相同。术语“类”更常用于描述复杂类型(库或用户定义),而术语“类型”用于描述基本原语(例如整数,字符串,列表)或任何类型。
(我不知道某些内置类型是否与用户定义类型的实现方式不同;首先,有几个Python解释器可能彼此不同。重要的是概念上,内置类型和用户定义的类型没有区别。)
类型(类)的实例是使用其类型对象的信息构造的对象,其行为与其类型对象通告的方式相同。
实例对象通过__class__
属性连接到它们的类型对象(尽管最好使用type()
函数来获取对象的类型)。这个连接是一个普通引用,一个对象保存到另一个,它的实现没有特殊,除了解释器将使用这个引用来实现子类和反射。有时它甚至可以在运行时改变。