> For the complete documentation index, see [llms.txt](https://hai-shi.gitbook.io/cpython-internals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hai-shi.gitbook.io/cpython-internals/12-objects-types.md).

# 十二、对象和类型

CPython 自带了一系列基本类型，例如字符串、列表、元组、字典和对象。

所有这些类型都是内置的。你不需要导入任何库，甚至不需要从标准库中导入。

例如，要创建一个新的列表，你可以调用：

```python
lst = list()
```

或者，你可以使用方括号：

```python
lst = []
```

字符串可以使用双引号或单引号从一个字符串字面量（string literal）实例化。在 [“Python 语言和语法”](/cpython-internals/5-language-and-grammar.md) 章节中，你探索了一些语法定义，它们让编译器把双引号解释为一个字符串字面量。

Python 中的所有类型都继承自一个内置的基类型 `object`。即便是字符串、元组和列表也都继承自 `object`。

`object` 类型的基本实现在 `Object/object.c` 中，它是用纯 C 实现的。还有一些基本逻辑的具体实现，比如浅层比较（shallow comparisons）。

你可以将 Python 对象视为由两个部分组成：

1. 核心数据模型，包括指向已编译函数的指针
2. 一个带有任意自定义属性和方法的字典

许多基本的对象 API 在 `Objects/object.c` 中声明，比如内置函数 `repr()` 的实现，`PyObject_Repr`。在文件中你还可以找到 `PyObject_Hash()` 和其他 API。

通过在 Python 对象上实现 **双下划线**（dunder methods）方法，所有这类函数都可以在自定义对象中被重写：

```python
class MyObject(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
    def __repr__(self):
        return "<{0} id={1}>".format(self.name, self.id)
```

所有的这些内置函数被称之为 [Python 数据模型](https://docs.python.org/3/reference/datamodel.html)。并不是说一个 Python 对象中的所有方法都是数据模型的一部分，这种数据模型使得 Python 对象可以包含类或实例属性以及方法。

{% hint style="info" %}
**参见**

Luciano Ramalho 的《Fluent Python, 2nd Edition》是了解 Python 数据模型的极佳资源。
{% endhint %}
