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

Gần đây, tôi bắt đầu học Python. Xuất thân từ ngôn ngữ lập trình C, ban đầu Python cảm thấy siêu dễ. Không còn nửa cột, lỗi phân đoạn, malloc'ing và giải phóng bộ nhớ và… không còn con trỏ nữa. Sau đó, chúng ta bắt đầu tìm hiểu về đối tượng, lớp, thuộc tính thể hiện… và đó là lúc mọi thứ bắt đầu phức tạp hơn. Trong bài đăng này, tôi muốn chia sẻ những gì tôi đã học được cho đến nay với hy vọng nó sẽ giúp ích cho tất cả các sinh viên Python hiện tại và tương lai— vì vậy, hãy bắt đầu nào

Giới thiệu rất ngắn gọn về Python

Python là ngôn ngữ lập trình hướng đối tượng, thông dịch, tương tác. Nó kết hợp các mô-đun, ngoại lệ, gõ động, kiểu dữ liệu động mức rất cao và các lớp. —

Python được phát triển bởi Guido van Rossum vào cuối những năm 1980 và được phát hành lần đầu tiên vào năm 1991. Nó được đặt tên theo chương trình “Monty Python” của đài BBC, không phải theo con vật một cách đáng ngạc nhiên. 🐍

Python là một trong những ngôn ngữ lập trình được sử dụng nhiều nhất hiện nay. Nó nổi tiếng vì dễ sử dụng, dễ đọc và nhỏ gọn (các tập lệnh Python thường ngắn hơn nhiều so với C). Nó cũng có thể mở rộng và có thể được sử dụng cho nhiều ứng dụng khác nhau, từ phát triển web và phần mềm đến toán học và tập lệnh hệ thống, có thể kể đến một số ứng dụng.

Phiên bản Python mới nhất là Python 3, đây là phiên bản tôi sẽ sử dụng cho blog này

Ngôn ngữ lập trình hướng đối tượng là gì?

Lập trình hướng đối tượng (OOP) là một mô hình lập trình máy tính trong đó thiết kế phần mềm được tổ chức xung quanh dữ liệu hoặc đối tượng, thay vì chức năng và logic

Trong OOP có 4 khối xây dựng

  • Các lớp — chúng là các kiểu dữ liệu do người dùng định nghĩa và đóng vai trò là bản thiết kế cho các đối tượng, thuộc tính và phương thức riêng lẻ
  • Các đối tượng - chúng là các thể hiện của một lớp với dữ liệu được xác định cụ thể
  • Phương thức - chúng là các hàm được định nghĩa bên trong lớp và mô tả hành vi của đối tượng
  • Thuộc tính - chúng được tạo trong mẫu lớp và biểu thị trạng thái của một đối tượng

Hôm nay chúng ta sẽ tập trung vào các đối tượng

Các đối tượng trong Python

Trong Python, mọi thứ được coi là một đối tượng. Một đối tượng trong Python có thể được định nghĩa là một trường dữ liệu có các thuộc tính và hành vi duy nhất. Nếu một lớp là một ý tưởng, thì một đối tượng là sự thực thi của nó

Có ba thuộc tính mà mọi đối tượng đều có

  • Danh tính (hoặc id) - đó là địa chỉ của đối tượng trong bộ nhớ
  • Loại - đó là loại đối tượng được tạo - e. g. số nguyên, chuỗi, danh sách
  • Giá trị - đó là giá trị dữ liệu được lưu trữ bởi đối tượng. e. g
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    2giữ số nguyên 1, 2 và 3

Id và loại không thể thay đổi khi đối tượng được tạo. Các giá trị có thể được thay đổi nhưng chỉ dành cho các đối tượng có thể thay đổi

Các đối tượng có thể thay đổi và không thể thay đổi

Các đối tượng trong Python có thể thay đổi hoặc không thay đổi

Từ điển Merriam-Webster định nghĩa hai tính từ này như sau

Có thể thay đổi - dễ thay đổi, có khả năng thay đổi hoặc bị thay đổi, có khả năng hoặc có khả năng thay đổi

Bất biến - không có khả năng hoặc dễ bị thay đổi

Trong ngữ cảnh của Python, có thể thay đổi là khả năng của các đối tượng thay đổi giá trị của chúng. Giá trị của một đối tượng có thể thay đổi có thể được thay đổi theo thời gian. Trong khi đó, giá trị của một đối tượng bất biến, không thể thay đổi theo thời gian. Sau khi được tạo, giá trị của các đối tượng này là vĩnh viễn

Loại có thể thay đổi phổ biến (hầu hết mọi thứ khác)

  • trình tự có thể thay đổi.
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    3,
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    4
  • thiết lập loại.
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    5
  • loại bản đồ.
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    6
  • lớp, trường hợp lớp
  • v.v. (đó là hầu hết mọi thứ khác. )

Loại bất biến phổ biến

  • con số.
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    7,
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    8,
     >>> a = 1
    >>> b = 2
    >>> id(a)
    4373702960
    >>> id(b)
    4373702992
    9
  • trình tự bất biến.
    >>> a = 1
    >>> b = 2
    >>> a is b
    False
    >>> id(a)
    4339826928
    >>> id(b)
    4339826960
    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> id(a)
    4339826928
    >>> id(a)
    4339826928
    >>> s_1 = "Hello"
    >>> s_2 = "Hello"
    >>> s_1 is s_2
    True
    >>> id(s_1)
    4344344816
    >>> id(s_2)
    4344344816
    0,
    >>> a = 1
    >>> b = 2
    >>> a is b
    False
    >>> id(a)
    4339826928
    >>> id(b)
    4339826960
    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> id(a)
    4339826928
    >>> id(a)
    4339826928
    >>> s_1 = "Hello"
    >>> s_2 = "Hello"
    >>> s_1 is s_2
    True
    >>> id(s_1)
    4344344816
    >>> id(s_2)
    4344344816
    1,
    >>> a = 1
    >>> b = 2
    >>> a is b
    False
    >>> id(a)
    4339826928
    >>> id(b)
    4339826960
    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> id(a)
    4339826928
    >>> id(a)
    4339826928
    >>> s_1 = "Hello"
    >>> s_2 = "Hello"
    >>> s_1 is s_2
    True
    >>> id(s_1)
    4344344816
    >>> id(s_2)
    4344344816
    2,
    >>> a = 1
    >>> b = 2
    >>> a is b
    False
    >>> id(a)
    4339826928
    >>> id(b)
    4339826960
    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> id(a)
    4339826928
    >>> id(a)
    4339826928
    >>> s_1 = "Hello"
    >>> s_2 = "Hello"
    >>> s_1 is s_2
    True
    >>> id(s_1)
    4344344816
    >>> id(s_2)
    4344344816
    3

Ghi chú. bộ dữ liệu và bộ cố định là những trường hợp đặc biệt vì chúng là bất biến nhưng chúng có thể chứa các đối tượng có thể thay đổi - sẽ nói thêm về điều đó sau

Loại() của bạn là gì?

Để kiểm tra xem biến thuộc loại nào, bạn có thể sử dụng hàm có sẵn

>>> a = 1
>>> b = 2
>>> a is b
False
>>> id(a)
4339826928
>>> id(b)
4339826960
>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a)
4339826928
>>> id(a)
4339826928
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 is s_2
True
>>> id(s_1)
4344344816
>>> id(s_2)
4344344816
4

Hàm dựng sẵn

>>> a = 1
>>> b = 2
>>> a is b
False
>>> id(a)
4339826928
>>> id(b)
4339826960
>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a)
4339826928
>>> id(a)
4339826928
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 is s_2
True
>>> id(s_1)
4344344816
>>> id(s_2)
4344344816
4 trả về loại đối số (đối tượng) được truyền dưới dạng tham số

>>> a = 1
>>> type(a)

Lưu ý rằng có một hàm tích hợp khác cũng kiểm tra loại đối tượng_______8_______6, hàm này nhận hai đối số, đối tượng bạn muốn kiểm tra và loại mà bạn muốn kiểm tra. Nó trả về một giá trị boolean tương ứng. Một điểm khác biệt nữa là

>>> a = 1
>>> b = 2
>>> a is b
False
>>> id(a)
4339826928
>>> id(b)
4339826960
>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a)
4339826928
>>> id(a)
4339826928
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 is s_2
True
>>> id(s_1)
4344344816
>>> id(s_2)
4344344816
6 kiểm tra thêm các lớp con, trong khi
>>> a = 1
>>> b = 2
>>> a is b
False
>>> id(a)
4339826928
>>> id(b)
4339826960
>>> a = 1
>>> b = 1
>>> a is b
True
>>> id(a)
4339826928
>>> id(a)
4339826928
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 is s_2
True
>>> id(s_1)
4344344816
>>> id(s_2)
4344344816
4 thì không.

Nhưng làm cách nào để kiểm tra xem một biến có thể thay đổi hay không thay đổi? . Hãy xem cách chúng hoạt động

Cùng một đối tượng hay không?

Mỗi đối tượng có một danh tính, một loại và một giá trị. Danh tính của một đối tượng không bao giờ thay đổi khi nó đã được tạo; . Toán tử 'is' so sánh danh tính của hai đối tượng; . Tham khảo ngôn ngữ Python

Cách tìm danh tính đối tượng. Tôi()

Id của đối tượng là duy nhất và không đổi đối với đối tượng đó trong suốt thời gian tồn tại của nó. Hai đối tượng có thời gian sống không chồng chéo có thể có cùng id. Id của đối tượng sẽ khác nhau mỗi khi bạn chạy chương trình. Ngoài một vài trường hợp ngoại lệ, chúng tôi sẽ đề cập sau trong blog

Để kiểm tra id của một đối tượng, chúng ta có thể sử dụng hàm có sẵn

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
2 của Python, hàm này chấp nhận một tham số duy nhất và trả về một số nguyên đại diện cho danh tính của đối tượng

 >>> a = 1
>>> b = 2
>>> id(a)
4373702960
>>> id(b)
4373702992

Bạn có thể thấy trong ví dụ trên

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
3 và
>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
4 có các giá trị khác nhau của
>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
5

là hay không - đó là câu hỏi

Toán tử

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
0sẽ so sánh nếu hai tên tham chiếu đến cùng một đối tượng và trả về true nếu chúng là (
>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
1sẽ làm ngược lại. )

Trong trường hợp các đối tượng không thể thay đổi, chẳng hạn như số nguyên và chuỗi, Python tối ưu hóa tài nguyên bằng cách tạo hai tên tham chiếu đến cùng một giá trị chuỗi tham chiếu đến cùng một đối tượng

________số 8_______

Quan trọng — toán tử

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
0 không giống với toán tử so sánh
>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
9

Toán tử

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
9 sẽ chỉ kiểm tra xem các đối tượng có cùng giá trị hay không, không phải nếu chúng là cùng một đối tượng. Nếu chúng có cùng giá trị, nó sẽ trả về True, nếu không thì False

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True

Bạn có thể thấy từ ví dụ bên dưới rằng khi toán tử

>>> a = 1
>>> b = 2
>>> a == b
False
>>> b = 2
>>> a == b
True
>>> s_1 = "Hello"
>>> s_2 = "Hello"
>>> s_1 == s_2
True
9 trả về
>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
2 thì số id cũng sẽ giống như vậy. Ngược lại khi nó trả về
>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
3

Danh sách, tuy nhiên, hoạt động khác nhau. list_a và list_b có cùng giá trị nhưng không tham chiếu đến cùng một đối tượng

>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False

bí danh

Khi chúng ta gán một tên khác cho cùng một biến, đó được gọi là bí danh. Những thay đổi được thực hiện cho một bí danh sẽ ảnh hưởng đến bí danh khác

>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True

Ghi chú. Bí danh có thể hữu ích khi làm việc với các đối tượng không thay đổi, tuy nhiên, tốt nhất nên tránh khi xử lý các đối tượng có thể thay đổi vì nó có thể hoạt động theo những cách không mong muốn hoặc ngoài ý muốn

Ngoại lệ trong tính bất biến

Mọi quy tắc đều có ngoại lệ. Trong sự chăm sóc này, họ là

  • Số nguyên từ -5 đến 256 (bao gồm)

Chúng có một id duy nhất không đổi, do đó chúng sẽ luôn trỏ đến cùng một đối tượng đã tồn tại trong bộ nhớ. Để biết thêm thông tin, hãy xem bài viết này. Toán tử “is” hoạt động không mong muốn với các số nguyên

  • Một số chuỗi
>>> a = "Python is cool!"
>>> b = "Python is cool!"
>>> a is b
False

Đây là sản phẩm của cách thực tập chuỗi hoạt động trong Python. Thực tập chuỗi là cơ chế chỉ lưu trữ một bản sao của một giá trị chuỗi trong bộ nhớ để tiết kiệm không gian bộ nhớ và thời gian khi so sánh các chuỗi có giá trị giống nhau. Tóm lại, nếu chuỗi dài “rất” thì Python nghĩ sẽ không tiết kiệm thời gian để so sánh nên nó sẽ tạo một bản sao khác. Để tìm hiểu thêm về thực tập chuỗi, hãy xem

  • bộ trống

Các bộ dữ liệu thuộc loại bất biến, nhưng chứa các đối tượng có thể thay đổi. Danh sách và các đối tượng có thể thay đổi khác bên trong bộ dữ liệu có thể thay đổi, nhưng id của chúng sẽ luôn giống nhau. Vì vậy, các bộ dữ liệu ngay cả khi chúng có cùng giá trị sẽ trỏ đến các đối tượng khác nhau. Ngoại trừ các bộ dữ liệu trống sẽ đề cập đến cùng một đối tượng. Đây là bằng chứng trong mã👇🏾

>>> a = (1, 2)
>>> b = (1, 2)
>>> a is b
False
>>> a = ()
>>> b = ()
>>> a is b
True

Để tìm hiểu thêm về cách các bộ dữ liệu hoạt động, đây là bài đăng trên blog tuyệt vời của Luciano Ramalho

Sự khác biệt với = và += Toán tử

Chỉ định và tham chiếu

Hãy xem ví dụ mã

>>> list_a = [0, 2, 4]
>>> id(list_a)
4310781760
>>> list_a = list_a + [6]
>>> id(list_a)
4310785408
>>> list_a
[0, 2, 4, 6]
>>> list_b = [1, 3, 5]
>>> id(list_b)
4310763904
>>> list_b += [7]
>>> id(list_b)
4310763904
>>> list_b
[1, 3, 5, 7]

Bạn có thấy điều gì vừa xảy ra không?

Để hiểu tại sao điều này xảy ra, chúng ta cần hiểu sự khác biệt giữa hai toán tử

Toán tử

>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
5 gọi phương thức ma thuật
>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
8 không sửa đổi một trong hai đối số. Vì vậy,
>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
9tạo một đối tượng mới với giá trị [0, 2, 4, 6], mà
>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
4 ở phía bên trái hiện đề cập đến. *

Trong khi đó, toán tử

>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
6 (tương đương với
>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True
2 gọi
>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True
3 để sửa đổi các đối số tại chỗ

*Ghi chú. Như trong nhiều ngôn ngữ lập trình, trong câu lệnh gán, tên ở vế trái được liên kết với giá trị ở vế phải. Phía bên tay phải được đánh giá đầu tiên. Điều đó sau đó tạo một đối tượng mới hoặc truy xuất một đối tượng hiện có. Chỉ sau khi đối tượng được tạo hoặc truy xuất, tên mới được gán cho nó. Trong Python, chúng tôi nói rằng tên đề cập đến giá trị hoặc tên là tham chiếu đến giá trị

Còn một điều cuối cùng tôi muốn đề cập trước khi kết thúc blog này và đó là…

Truyền các đối tượng có thể thay đổi và không thể thay đổi

Bạn có thể thắc mắc làm thế nào các đối số được truyền cho các hàm và điều đó có nghĩa là gì đối với các đối tượng có thể thay đổi và không thể thay đổi?

Đối tượng bất biến

Hãy xem xét ví dụ dưới đây

def increment(n):
n += 1

a = 1
increment(a)
print(a)
1

Trong trường hợp này, chúng ta có một var______37_______4 Hàm increment(n) có biến cục bộ n được tham chiếu đến cùng một đối tượng. Tuy nhiên, vì số nguyên là bất biến nên chúng ta không thể thay đổi giá trị của đối tượng thành 2 tại chỗ. chúng ta sẽ phải tạo đối tượng mới với giá trị 2. Đây là lý do tại sao giá trị của

>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True
5 không thay đổi sau khi gọi
>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True
6

Tuy nhiên, chúng ta có thể sửa đổi giá trị của một đối tượng bất biến bằng cách thêm giá trị trả về vào hàm

 >>> a = 1
>>> b = 2
>>> id(a)
4373702960
>>> id(b)
4373702992
0

Đối tượng có thể thay đổi

Tuy nhiên, các đối tượng có thể thay đổi, chẳng hạn như danh sách, có thể được sửa đổi tại chỗ — đó là điều mà phương thức

>>> a = [7, 8, 9]
>>> b = a
>>> a is b
True
7 thực hiện trong ví dụ bên dưới

 >>> a = 1
>>> b = 2
>>> id(a)
4373702960
>>> id(b)
4373702992
1

Không có đối tượng mới nào được tạo và thay đổi xảy ra ở vị trí của đối tượng — vì vậy khi in

>>> list_a = [4, 5, 6]
>>> list_b = [4, 5, 6]
>>> list_a == list_b
True
>>> list_a is list_b
False
4, chúng tôi nhận được danh sách đã sửa đổi

Và đó là một bọc

Nguồn. Giphy của Flat-icons. com

Tôi hy vọng bạn đã tìm thấy bài viết này hữu ích. Đối với bất kỳ câu hỏi, nhận xét hoặc nếu bạn muốn nói xin chào, hãy kết nối với tôi trên LinkedIn hoặc theo dõi tôi tại đây trên Phương tiện

Có phải tất cả mọi thứ là một đối tượng?

- [Giảng viên] Trong lập trình hướng đối tượng, mọi thứ đều là đối tượng . Trên thực tế, chúng tôi đã làm việc với các đối tượng suốt thời gian qua. Có thể bạn chưa nhận ra. Hãy lấy một số nguyên đơn giản, int giá trị của tôi bằng năm.

Có phải tất cả các loại đối tượng trong Python?

Mọi thứ trong Python đều là đối tượng bao gồm các lớp . Tất cả các lớp là thể hiện của một lớp gọi là "loại". Đối tượng kiểu cũng là một thể hiện của lớp kiểu. Bạn có thể kiểm tra hệ thống phân cấp thừa kế của lớp bằng cách kiểm tra thuộc tính __bases__ của một đối tượng lớp.

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 .

Python có phải là một đối tượng không?

Python là ngôn ngữ lập trình hướng đối tượng. Hầu hết mọi thứ trong Python đều là đối tượng , với các thuộc tính và phương thức của nó. Lớp giống như một hàm tạo đối tượng hoặc "bản thiết kế" để tạo đối tượng.