Python mọi thứ đều là một đối tượng

Phần này sẽ bắt đầu đề cập đến ngữ nghĩa cơ bản của ngôn ngữ Python. Trái ngược với cú pháp được đề cập trong phần trước, ngữ nghĩa của một ngôn ngữ liên quan đến ý nghĩa của các câu lệnh. Như với cuộc thảo luận về cú pháp của chúng ta, ở đây chúng ta sẽ xem trước một số cấu trúc ngữ nghĩa thiết yếu trong Python để cung cấp cho bạn hệ quy chiếu tốt hơn để hiểu mã trong các phần sau

Phần này sẽ đề cập đến ngữ nghĩa của các biến và đối tượng, đó là những cách chính để bạn lưu trữ, tham chiếu và thao tác trên dữ liệu trong tập lệnh Python

Biến Python là con trỏ¶

Gán biến trong Python dễ như đặt tên biến ở bên trái dấu bằng (

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
0)

# assign 4 to the variable x
x = 4

Điều này có vẻ đơn giản, nhưng nếu bạn có mô hình tinh thần sai về hoạt động này, thì cách thức hoạt động của Python có vẻ khó hiểu. Chúng ta sẽ tìm hiểu ngắn gọn về điều đó ở đây

Trong nhiều ngôn ngữ lập trình, các biến tốt nhất nên được coi là thùng chứa hoặc bộ chứa mà bạn đặt dữ liệu vào đó. Vì vậy, trong C, chẳng hạn, khi bạn viết

// C code
int x = 4;

về cơ bản, bạn đang xác định một "bộ nhớ" có tên là

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1 và đặt giá trị
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
2 vào đó. Ngược lại, trong Python, các biến tốt nhất không nên được coi là vùng chứa mà là con trỏ. Vì vậy, trong Python, khi bạn viết

x = 4

về cơ bản, bạn đang xác định một con trỏ có tên

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1 trỏ đến một số nhóm khác có chứa giá trị
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
2. Lưu ý một hậu quả của việc này. bởi vì các biến Python chỉ trỏ đến các đối tượng khác nhau, không cần phải "khai báo" biến hoặc thậm chí yêu cầu biến luôn trỏ đến thông tin cùng loại. Đây là ý nghĩa mà mọi người nói Python được gõ động. tên biến có thể trỏ đến các đối tượng thuộc bất kỳ loại nào. Vì vậy, trong Python, bạn có thể làm những việc như thế này

Trong 1]

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list

Mặc dù người dùng các ngôn ngữ được nhập tĩnh có thể bỏ lỡ kiểu an toàn đi kèm với các khai báo giống như trong C,

int x = 4;

kiểu gõ động này là một trong những phần giúp Python viết nhanh và dễ đọc

Có một hệ quả của cách tiếp cận "biến như con trỏ" này mà bạn cần lưu ý. Nếu chúng ta có hai tên biến trỏ đến cùng một đối tượng có thể thay đổi, thì việc thay đổi tên này cũng sẽ thay đổi tên kia. Ví dụ: hãy tạo và sửa đổi danh sách

Trong 2]

# assign 4 to the variable x
x = 4
0

Chúng tôi đã tạo hai biến

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1 và
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
6, cả hai đều trỏ đến cùng một đối tượng. Do đó, nếu chúng tôi sửa đổi danh sách thông qua một trong các tên của nó, chúng tôi sẽ thấy rằng danh sách "khác" cũng sẽ được sửa đổi

Trong 3]

# assign 4 to the variable x
x = 4
3

# assign 4 to the variable x
x = 4
4

Trong [4]

# assign 4 to the variable x
x = 4
5

# assign 4 to the variable x
x = 4
6

Hành vi này có vẻ khó hiểu nếu bạn nghĩ sai về các biến là các thùng chứa dữ liệu. Nhưng nếu bạn đang nghĩ đúng về các biến là con trỏ tới đối tượng, thì hành vi này có ý nghĩa

Cũng lưu ý rằng nếu chúng ta sử dụng "

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
0" để gán giá trị khác cho
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1, điều này sẽ không ảnh hưởng đến giá trị của
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
6 – phép gán chỉ đơn giản là thay đổi đối tượng mà biến trỏ tới

Trong [5]

// C code
int x = 4;
0

# assign 4 to the variable x
x = 4
6

Một lần nữa, điều này hoàn toàn hợp lý nếu bạn coi

x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1 và
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
6 là con trỏ và toán tử "
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
0" là một phép toán thay đổi thứ mà tên trỏ tới

Bạn có thể thắc mắc liệu ý tưởng con trỏ này có làm cho các phép tính số học trong Python khó theo dõi hay không, nhưng Python được thiết lập để đây không phải là vấn đề. Số, chuỗi và các loại đơn giản khác là bất biến. bạn không thể thay đổi giá trị của chúng – bạn chỉ có thể thay đổi giá trị mà các biến trỏ tới. Vì vậy, ví dụ, hoàn toàn an toàn khi thực hiện các thao tác như sau

Trong [6]

// C code
int x = 4;
2

// C code
int x = 4;
3

Khi chúng tôi gọi

int x = 4;
3, chúng tôi không sửa đổi giá trị của đối tượng
int x = 4;
4 được chỉ ra bởi
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
1; . Vì lý do này, giá trị của
x = 1         # x is an integer
x = 'hello'   # now x is a string
x = [1, 2, 3] # now x is a list
6 không bị ảnh hưởng bởi hoạt động

Mọi thứ đều là đối tượng¶

Python là ngôn ngữ lập trình hướng đối tượng và trong Python mọi thứ đều là đối tượng

Hãy xác định điều này có nghĩa là gì. Trước đó chúng ta đã thấy rằng các biến chỉ đơn giản là con trỏ và bản thân tên biến không có thông tin kiểu đính kèm. Điều này khiến một số người tuyên bố sai rằng Python là ngôn ngữ không có kiểu. Nhưng đây không phải là trường hợp. Hãy xem xét những điều sau đây

Trong [7]

// C code
int x = 4;
4

Ra[7]

// C code
int x = 4;
5

Trong [8]

// C code
int x = 4;
6

Ra[8]

// C code
int x = 4;
7

Trong [9]

// C code
int x = 4;
8

Ra[9]

// C code
int x = 4;
9

Python có các loại;

Trong các ngôn ngữ lập trình hướng đối tượng như Python, một đối tượng là một thực thể chứa dữ liệu cùng với siêu dữ liệu và/hoặc chức năng được liên kết. Trong Python, mọi thứ đều là một đối tượng, có nghĩa là mọi thực thể đều có một số siêu dữ liệu (được gọi là thuộc tính) và chức năng liên quan (được gọi là phương thức). Các thuộc tính và phương thức này được truy cập thông qua cú pháp dấu chấm

Ví dụ, trước đây chúng ta đã thấy rằng các danh sách có một phương thức

int x = 4;
9, phương thức này sẽ thêm một mục vào danh sách và được truy cập thông qua cú pháp dấu chấm ("
# assign 4 to the variable x
x = 4
00")

Trong [10]

x = 4
0

x = 4
1

Mặc dù có thể mong đợi các đối tượng phức hợp như danh sách có các thuộc tính và phương thức, nhưng điều đôi khi bất ngờ là trong Python, ngay cả các kiểu đơn giản cũng có các thuộc tính và phương thức kèm theo. Ví dụ: các loại số có thuộc tính

# assign 4 to the variable x
x = 4
01 và
# assign 4 to the variable x
x = 4
02 trả về phần thực và phần ảo của giá trị, nếu được xem dưới dạng số phức

Trong [11]

x = 4
2

x = 4
3

Các phương thức giống như các thuộc tính, ngoại trừ chúng là các hàm mà bạn có thể gọi bằng cách sử dụng dấu ngoặc đơn mở và đóng. Ví dụ: số dấu phẩy động có một phương thức gọi là

# assign 4 to the variable x
x = 4
03 để kiểm tra xem giá trị có phải là số nguyên không

Trong [12]

x = 4
4

Ra[12]

x = 4
5

Trong [13]

x = 4
6

Ra[13]

x = 4
7

Khi chúng tôi nói rằng mọi thứ trong Python là một đối tượng, chúng tôi thực sự muốn nói rằng mọi thứ đều là một đối tượng – ngay cả các thuộc tính và phương thức của các đối tượng cũng là các đối tượng có thông tin

# assign 4 to the variable x
x = 4
04 của riêng chúng

Trong [14]

x = 4
8

Ra[14]

x = 4
9

Chúng ta sẽ thấy rằng sự lựa chọn thiết kế mọi thứ là đối tượng của Python cho phép một số cấu trúc ngôn ngữ rất thuận tiện

Mọi thứ trong Python có phải là một đối tượng không?

Mọi thứ đều là đối tượng . Trong Python, mọi thứ đều là một đối tượng, có nghĩa là mọi thực thể đều có một số siêu dữ liệu (được gọi là thuộc tính) và chức năng liên quan (được gọi là phương thức).

Nó có nghĩa là gì tất cả mọi thứ là một đối tượng?

Điều đó có nghĩa là mọi thứ từ int đến chuỗi đến hàm đến lớp đều là đối tượng có phương thức và "bộ tạo" và toàn bộ cấu trúc. try help(int) in an interpreter. that whole (almost) list is functions you can run. for example, x.__float__() is the same as float(x)

Mọi thứ có thể là một đối tượng?

Có, trong nhiều ngôn ngữ lập trình hướng đối tượng, mọi thứ đều là đối tượng . Ví dụ, trong Java và C#, kiểu dữ liệu cơ bản nhất là Đối tượng. Ngoại trừ "các loại tích hợp sẵn" ( int , float , v.v. ), mọi thứ bắt nguồn (kế thừa) từ Object.

Mọi thứ trong Python có phải là một chuỗi không?

Vì Python là ngôn ngữ lập trình hướng đối tượng nên mọi thứ trong Python đều là đối tượng, mọi số nguyên, chuỗi, danh sách và hàm .