13. Triển khai đối tượng tích hợp

Các đối tượng tích hợp là cấu trúc dữ liệu cụ thể đằng sau các kiểu lõi của Python. Chúng là các đối tượng Python thông thường theo nghĩa là chúng có danh tính, loại, số lượng tham chiếu, thuộc tính được hỗ trợ và hành vi được xác định bởi các vị trí loại. Chúng đặc biệt vì việc lưu trữ và hoạt động của chúng được triển khai trực tiếp trong C.

Chương này cung cấp một bản đồ rộng. Các chương sau sẽ đi sâu hơn vào các chuỗi, danh sách, bộ dữ liệu, từ điển, bộ, số, hàm, mô-đun và khung.

13.1 Phần dựng sẵn là đối tượng kiểu

Một loại tích hợp nhưlist, dict, hoặcintbản thân nó là một đối tượng Python.python print(type(list)) # <class 'type'> print(type(dict)) # <class 'type'> print(type(int)) # <class 'type'> Một instance trỏ tới đối tượng kiểu của nó.python xs = [1, 2, 3] print(type(xs)) # <class 'list'> Ở cấp độ C:```text xs ---> PyListObject ob_refcnt ob_type ----> PyList_Type ob_size ob_item allocated


## 13.2 Tại sao các phần dựng sẵn được triển khai trong C

Các loi tích hp nm trên các đường dn thc thi Python ph biến nht.

Các hot động ph biến bao gm:```text
integer arithmetic
string hashing
attribute lookup
dictionary lookup
list append
tuple creation
function calls
iteration
exception creation
```Nếu các thao tác này được trin khai như mã Python thông thường, trình thông dch s phi thc thi nhiu mã byte hơn để thc hin các thao tác cơ bn ca chính nó. CPython tránh điu này bng cách trin khai các loi lõi trong C.

Ví d: t đin Python được s dng cho:```text
module globals
class namespaces
object attributes
keyword arguments
import caches
annotations
many user data structures
```Mt t đin chm s làm cho toàn b trình thông dch chm li.

## 13.3 Mẫu đối tượng tích hợp phổ biến

Hu hết các trin khai đối tượng tích hp đều tuân theo hình dng này:```c
typedef struct {
    PyObject_HEAD
    /* type-specific fields */
} SomeObject;
```hoc, đối vi các đối tượng có kích thước thay đổi:```c
typedef struct {
    PyObject_VAR_HEAD
    /* type-specific fields */
} SomeVarObject;
```Đối tượng loi sau đó cung cp các v trí:```c
PyTypeObject Some_Type = {
    .tp_name = "...",
    .tp_basicsize = sizeof(SomeObject),
    .tp_dealloc = ...,
    .tp_repr = ...,
    .tp_as_number = ...,
    .tp_as_sequence = ...,
    .tp_as_mapping = ...,
    .tp_methods = ...,
};
```Mô hình này lp li trên CPython.

## 13.4 Họ đối tượng

Các h đối tượng tích hp chính là:

| Gia đình | Ví d | Vai trò chính |
| -------------- | --------------------------------------------- | -------------------------------- |
| Đối tượng s |`int`, `float`, `complex`, `bool`| Giao thc s hc và s |
| Đối tượng văn bn và nh phân |`str`, `bytes`, `bytearray`, `memoryview`| Văn bn, d liu nh phân, b đệm |
| Đối tượng tun t |`list`, `tuple`, `range`| B sưu tp đã đặt hàng |
| Ánh x đối tượng |`dict`, `mappingproxy`| Lưu tr khóa-giá tr |
| Đặt đối tượng |`set`, `frozenset`| Thành viên da trên hàm băm |
| Đối tượng có th gi được | hàm, phương thc, hàm dng sn | Li mi |
| Đối tượng thi gian chy | mô-đun, khung, mã, truy nguyên | Máy thi công |
| Đối tượng mô t | thuc tính, getset, thành viên, mô t phương thc | Hành vi thuc tính |
| Đối tượng lp | trình lp danh sách, trình lp dict, trình to | Lp li |
| Đối tượng ngoi l |`BaseException`và các lp con | Lan truyn li |

Mi h s dng cùng mt mô hình đối tượng nhưng ti ưu hóa cho các hot động khác nhau.

## 13.5 Đối tượng số nguyên

Python`int`các giá tr có độ chính xác tùy ý.```python
x = 10**100
print(x)
```CPython lưu tr s nguyên dưới dng`PyLongObject`, mt đối tượng có kích thước thay đổi. Nó không s dng mt s nguyên máy c định cho tt c các s nguyên Python.

V mt khái nim:```text
PyLongObject
    PyVarObject header
        ob_size = number of internal digits, with sign encoded
    digits[]
```S nguyên nh s dng vài ch s bên trong. S nguyên ln s dng nhiu ch s.

Điu này gii thích ti sao s nguyên Python không tràn như C`long`trong phép tính thông thường.```python
x = 2**1000
print(x * x)
```Chi phí tăng lên vi kích thước s nguyên. Các thao tác trên s nguyên nh rt nhanh. Các phép toán trên s nguyên rt ln đòi hi s hc có độ chính xác cao.

## 13.6 Đối tượng Boolean`bool`là một lớp con của`int`.

```python
print(isinstance(True, int))    # True
print(True + True)              # 2
```Có chính xác hai đối tượng singleton boolean:```python
True
False
``` cp độ C, đây là nhng đối tượng thuc s hu ca thi gian chy. Mã phi so sánh các giá tr boolean theo giá tr thc  cp độ Python ch không phi bng cách xây dng các phiên bn boolean mi.```python
if condition:
    ...
```Mã C thường tr v các boolean có macro như:```c
Py_RETURN_TRUE;
Py_RETURN_FALSE;
```## 13.7 Đối tượng dấu phẩy động

Python`float`thường được thc hin dưới dng C double.

V mt khái nim:```text
PyFloatObject
    PyObject header
    double value
```Mt đối tượng float có kích thước c định.```python
x = 1.5
y = 2.25
print(x + y)
```S hc ni tuân theo hành vi du phy động ca nn tng, nói chung là độ chính xác kép IEEE 754 trên các h thng ph biến.

Mt float lưu tr các s thc nh phân gn đúng. Nó không đại din chính xác cho phân s thp phân.```python
print(0.1 + 0.2)
```Kết qu đáng ngc nhiên đến t biu din du phy động nh phân, không phi t s hc dành riêng cho Python.

## 13.8 Đối tượng phức tạp

Python`complex`lưu tr hai giá tr du phy động:```text
PyComplexObject
    PyObject header
    real double
    imag double
```Ví d:```python
z = 1.5 + 2.0j
print(z.real)
print(z.imag)
```S phc tham gia vào các ô s. Chúng h tr s hc nhưng không h tr so sánh th t như`<`.

```python
1 + 2j < 3 + 4j     # TypeError
```## 13.9 Đối tượng chuỗi

Python`str`lưu tr văn bn Unicode.

Mt chui là bt biến.```python
s = "hello"
t = s.upper()

upper()tạo ra một chuỗi khác. Nó không biến đổis.

Việc triển khai Unicode của CPython được tối ưu hóa cho việc lưu trữ nhỏ gọn. Biểu diễn bên trong có thể sử dụng các độ rộng phần tử khác nhau tùy thuộc vào điểm mã lớn nhất trong chuỗi.

Về mặt khái niệm:text PyUnicodeObject object header length hash cache kind compact/ascii flags character data Tối ưu hóa chuỗi quan trọng bao gồm:```text cached hash value compact layout ASCII fast path interning for selected strings specialized Unicode operations


## 13,10 Byte và Bytearray`bytes`là dữ liệu nhị phân bất biến.```python
b = b"hello"

bytearraylà dữ liệu nhị phân có thể thay đổi.```python buf = bytearray(b"hello") buf[0] = ord("H")


| Loi | Có th thay đổi | Công dng chính |
| ----------- | ------: | --------------------- |
|`bytes`|      Không | D liu nh phân bt biến |
|`bytearray`|     Có | B đệm nh phân có th thay đổi |

C hai đều là các đối tượng ging như chui trên các s nguyên trong phm vi t 0 đến 255.```python
b = b"abc"
print(b[0])      # 97
```## 13.11 Danh sách đối tượng

Mt danh sách là mt chui có th thay đổi.```python
xs = [1, 2, 3]
xs.append(4)
```Đối tượng danh sách CPython lưu tr mt con tr ti mt mng tham chiếu đối tượng được phân b riêng.

V mt khái nim:```text
PyListObject
    PyVarObject header
        ob_size = logical length
    ob_item ----> array of PyObject *
    allocated = capacity
```Mng lưu tr các tham chiếu ch không phi d liu đối tượng ni tuyến.```text
list
    ob_item[0] ---> int object 1
    ob_item[1] ---> int object 2
    ob_item[2] ---> int object 3
```Danh sách phân b quá mc khi phát trin. Điu này làm cho lp đi lp li`append`trung bình có hiu qu.

## 13.12 Đối tượng Tuple

Mt tuple là mt chui bt biến.```python
t = (1, 2, 3)
```Mt b d liu lưu tr các tham chiếu mc ni tuyến trong phân b b d liu.

V mt khái nim:```text
PyTupleObject
    PyVarObject header
        ob_size = length
    ob_item[0]
    ob_item[1]
    ob_item[2]
```Mt tuple không th thay đổi độ dài sau khi to. Điu này làm cho vic lưu tr ni tuyến tr nên thiết thc.

Tính bt biến ca b d liu đề cp đến các tham chiếu ca b d liu, không nht thiết là kh năng biến đổi sâu ca các đối tượng được cha.```python
t = ([],)
t[0].append(1)
print(t)         # ([1],)
```Tuple vn tr đến cùng mt danh sách. Danh sách đã thay đổi.

## 13.13 Đối tượng chính tả

T đin là mt bng băm ánh x các khóa ti các giá tr.```python
d = {"name": "Ada", "age": 36}
```T đin được s dng xuyên sut CPython, không ch trong mã người dùng.

H lưu tr:```text
module globals
class namespaces
instance attributes
keyword arguments
import caches
```Mt tra cu dict đại khái cn:```text
hash the key
find a matching table slot
compare keys if needed
return associated value
```Thuc tính quan trng:```text
average O(1) lookup
insertion order preservation
hash-based key storage
resize when table becomes too full
specialized layouts for object attributes
```T đin là mt trong nhng đối tượng nhy cm nht v hiu sut trong CPython.

## 13.14 Đối tượng Set và Frozenset

Mt tp hp là mt bng băm gm các khóa không có giá tr.```python
seen = set()
seen.add("x")
```Mt Frozenset là bt biến.```python
s = frozenset(["a", "b"])
```Các b được ti ưu hóa cho các bài kim tra tư cách thành viên:```python
if item in seen:
    ...
```Cu trúc bên trong tương t như dict, nhưng ch lưu tr các phn t.

Các thao tác thiết lp bao gm:```text
union
intersection
difference
symmetric difference
subset testing
membership testing

frozensetcó thể băm được nếu tất cả các phần tử đều có thể băm được, vì vậy nó có thể được sử dụng làm khóa từ điển hoặc phần tử tập hợp.

13.15 Đối tượng phạm vi

Arangeđại diện cho một cấp số cộng mà không lưu trữ mọi phần tử.python r = range(0, 1_000_000, 2) Về mặt khái niệm:text range object start stop step length Đối tượng nhỏ gọn ngay cả đối với phạm vi lớn.```python import sys

print(sys.getsizeof(range(10))) print(sys.getsizeof(range(10**12)))


## 13.16 Đối tượng hàm

Đối tượng hàm Python bao bc mã thc thi và bi cnh thi gian chy.```python
def add(a, b):
    return a + b
```Mt đối tượng hàm cha các tham chiếu đến:```text
code object
globals dictionary
defaults
keyword defaults
closure cells
annotations
qualified name
module name
```V mt khái nim:```text
PyFunctionObject
    code
    globals
    defaults
    kwdefaults
    closure
    annotations
    name
    qualname
```Đối tượng mã cha mã byte. Đối tượng hàm cung cp môi trường cn thiết để thc thi mã byte đó.

## 13.17 Đối tượng mã

Mt đối tượng mã được biên dch siêu d liu có th thc thi được.

Nó cha:```text
bytecode
constants
names
local variable names
free variables
cell variables
stack size
flags
line table
exception table
filename
function name
```Ví d:```python
def f(x):
    return x + 1

code = f.__code__
print(code.co_consts)
print(code.co_varnames)
```Các đối tượng mã là bt biến. Chúng có th được chia s bi nhiu đối tượng chc năng.

## 13.18 Đối tượng mô-đun

Đối tượng mô-đun đại din cho mt mô-đun được nhp vào.```python
import math
print(math)
```Mt mô-đun ch yếu cha t đin không gian tên.

V mt khái nim:```text
module object
    name
    dict
    spec
    loader
    package
    file
```T đin mô-đun lưu tr các biến toàn cc được xác định bi mô-đun.```python
import math
print(math.__dict__["sqrt"])
```Nhp mô-đun s to hoc truy xut mt đối tượng mô-đun và lưu tr nó trong`sys.modules`.

## 13.19 Đối tượng lớp và đối tượng

Các lp là các đối tượng kiu. Các th hin là các đối tượng có con tr kiu tr đến lp.```python
class User:
    pass

u = User()
```V mt khái nim:```text
User
    type object
    attributes and methods
    base classes
    MRO

u
    instance object
    ob_type ---> User
    instance dictionary or slots
```Các trường hp thông thường thường lưu tr các thuc tính trong t đin.```python
u.name = "Ada"
```Vi`__slots__`, các phiên bn có th lưu tr các trường đã chn theo độ lch c định thay vì t đin.```python
class Point:
    __slots__ = ("x", "y")
```Điu này làm gim b nh trên mi phiên bn và có th tăng tc mt s kiu truy cp thuc tính.

## 13.20 Đối tượng phương thức

Khi mt hàm được truy cp thông qua mt th hin, Python s to mt đối tượng phương thc b ràng buc.```python
class C:
    def f(self):
        return 1

c = C()
m = c.f
```Phương thc ràng buc lưu tr:```text
function
self object
```V mt khái nim:```text
bound method
    __func__ ---> C.f
    __self__ ---> c
```Đang gi`m()`vượt qua`c`như đối s đầu tiên.

Đây là hành vi mô t. Khe mô t ca đối tượng hàm thc hin liên kết.

## 13.21 Các đối tượng hàm và phương thức tích hợp sẵn

Mt s kh năng gi được được trin khai trc tiếp trong C.

Ví d:```python
len
print
dict.get
list.append
```Đây là các đối tượng hàm hoc phương thc có sn. Chúng bao bc các con tr hàm C và siêu d liu.

Chúng nhanh hơn các hàm cp Python tương đương vì chúng tránh thc thi mã byte Python cho chính thao tác đó.

Mt phương pháp tích hp như`list.append`vn nhn các đối tượng Python và tuân theo các quy tc s hu tham chiếu trong ni b.

## 13.22 Đối tượng Iterator

Các đối tượng Iterator thc hin`__iter__`Và`__next__`.

```python
it = iter([1, 2, 3])
print(next(it))
```Mt danh sách iterator lưu tr:```text
reference to list
current index
```Mt trình vòng lp dict lưu tr:```text
reference to dict
iteration position
version or mutation state
```Các trình to cũng là các trình vòng lp, nhưng chúng phc tp hơn vì chúng cha các khung thc thi b treo.

## 13.23 Đối tượng tạo

Đối tượng trình to đại din cho vic thc thi chc năng b đình ch.```python
def count():
    yield 1
    yield 2
```Đang gi`count()`không chy phn thân hàm ngay lp tc. Nó to ra mt đối tượng máy phát đin.```python
g = count()
```Trình to lưu tr trng thái thc thi:```text
code or frame state
instruction position
locals
evaluation stack
exception state
closed/running state
```Mi`next(g)`tiếp tc thc hin cho đến ln tiếp theo`yield`hoc quay tr li.

Trình to kết ni mô hình đối tượng vi mô hình khung trình thông dch.

## 13.24 Đối tượng khung

Mt đối tượng khung đại din cho mt khi mã đang thc thi hoc b treo.

Khung cha:```text
code object
globals
builtins
locals
value stack
instruction pointer
exception state
previous frame link where exposed
```Các khung được to cho các lnh gi hàm, thc thi mô-đun, thc thi ni dung lp, trình to, coroutine và truy nguyên.

Các đối tượng khung rt quan trng đối vi:```text
debuggers
profilers
trace functions
exceptions
inspect module
generators and coroutines
```Chúng cũng đắt đến mc CPython đã c gng tránh hin thc hóa toàn b đối tượng khung hin th bng Python tr khi cn thiết trong mt s đường dn.

## 13.25 Đối tượng truy nguyên

Đối tượng truy nguyên ghi li nơi ngoi l được lan truyn.```python
try:
    1 / 0
except ZeroDivisionError as exc:
    tb = exc.__traceback__
```Mt liên kết truy nguyên ti:```text
frame
line number or instruction position
next traceback
```Tracebacks có th gi li khung. Khung có th gi li người dân địa phương. Điu này có nghĩa là các ngoi l có th gi cho các biu đồ đối tượng ln tn ti.

Đây là kiu lưu gi b nh ph biến trong các chương trình chy dài.

## 13.26 Đối tượng ngoại lệ

Ngoi l là các đối tượng thông thường có ngun gc t`BaseException`.

```python
try:
    raise ValueError("bad")
except ValueError as exc:
    print(exc.args)
```Mt đối tượng ngoi l có th lưu tr:```text
args
message data
__cause__
__context__
__traceback__
notes
custom attributes
```Các lp ngoi l là các lp bình thường, nhưng vic truyn bá ngoi l được tích hp sâu vào trình thông dch.

## 13.27 Đối tượng mô tả

B mô t kim soát quyn truy cp thuc tính.

Các loi đối tượng mô t tích hp bao gm:```text
function descriptors
method descriptors
member descriptors
getset descriptors
wrapper descriptors
property objects
classmethod objects
staticmethod objects
```Mt b mô t xác định mt hoc nhiu:```python
__get__
__set__
__delete__
```B mô t thc hin:```text
methods
properties
slots
C-level members
C-level computed attributes
special method wrappers
```Nếu không có b mô t, mô hình thuc tính và liên kết phương thc ca Python s kém linh hot hơn nhiu.

## 13.28 Đối tượng Memoryview

A`memoryview`hin th b đệm ca đối tượng khác mà không cn sao chép.```python
b = bytearray(b"hello")
v = memoryview(b)
```Chế độ xem b nh gi cho b đệm được xut tn ti và cho phép mã đọc hoc ghi b nh tùy thuc vào kh năng thay đổi.

Điu này rt cn thiết cho các hot động không sao chép trên các đối tượng ging như byte và các mô-đun m rng.

Đối tượng Memoryview tham gia vào các quy tc v thi gian tn ti ca b đệm. Nhà xut khu không được gii phóng hoc thay đổi kích thước b nh theo cách làm mt hiu lc các chế độ xem đang hot động.

## 13.29 Đối tượng dạng viên nang

Mt viên nang bao bc mt con tr C để trao đổi an toàn thông qua API Python.

Các tin ích m rng C s dng các viên nang để hin th các con tr gc mà không biến chúng thành các đối tượng Python bình thường.

V mt khái nim:```text
capsule
    void *pointer
    name
    destructor
    context
```Capsule rt hu ích cho kh năng tương tác m rng C. Chúng cho phép mt mô-đun tin ích m rng xut bn API C mà tin ích m rng khác có th nhp.

## 13.30 Sự đánh đổi khi triển khai đối tượng

Vic trin khai đối tượng tích hp cân bng mt s áp lc:

| Áp lc | Hiu ng |
| ------------- | ------------------------------------------------- |
| Tc độ | Đường dn C chuyên dng cho các hot động nóng |
| S dng b nh | B cc nh gn, chia s, thc tp, danh sách min phí |
| Kh năng tương thích | Ng nghĩa Python n định và hành vi API C |
| Kh năng sa li | Kim tra thi gian chy, xây dng g li, ni quan |
| Tính di động | Tránh các gi định phá v các nn tng được h tr |
| Kh năng m rng | Slots, giao thc, h tr phân lp |
| An toàn | Đếm tham chiếu, truyn ti GC, x lý li |

Nhiu chi tiết trin khai CPython xut phát t nhng s cân bng này.

Ví d: phân b quá mc danh sách s ci thin tc độ ni thêm nhưng có th gi li thêm b nh. Th t chèn chính t tn b nh nhưng mang li hành vi ngôn ng hu ích. Vic đếm tham chiếu cho phép hy b nhanh chóng nhưng yêu cu GC chu k và các quy tc s hu API C cn thn.

## 13.31 Mô hình tinh thần

S dng mô hình này:```text
built-in type
    C struct for instance layout
    PyTypeObject for behavior
    slots for protocols
    methods for public operations
    deallocator for owned references
    optional GC traversal for cycles
```Khi đọc cách trin khai kiu tích hp sn, hãy hi:```text
What does the object store?
Does it own Python references?
Is it fixed-size or variable-size?
Does it use auxiliary memory?
Does it participate in cyclic GC?
What slots does its type object fill?
What operations are hot paths?
What invariants must always hold?
```## 13.32 Tóm tắt

Các đối tượng tích hp là các trin khai C chuyên dng ca các giá tr thi gian chy ct lõi ca Python. Tt c chúng đều tuân theo cùng mt mô hình đối tượng: mt tiêu đề chung, mt con tr kiu, b nh dành riêng cho tng loi, quy tc s hu tham chiếu và hành vi được xác định bi các v trí loi.

Vic trin khai ca chúng được ti ưu hóa vì chúng nm bên dưới hu hết mi chương trình Python. Danh sách, b d liu, ký t, chui, hàm, mô-đun, khung và ngoi l không ch là tin ích ca thư vin. Chúng là b phn làm vic ca thông dch viên.