Có cần thiết phải tự viết trong python không?

Chẳng hạn, lớp Trái cây này tự gán tên và màu tùy chỉnh khi tạo. Sau đó, chúng có thể được truy cập bằng phương thức info()

class Fruit:
    def __init__(self, name, color):
        self.name = name
        self.color = color
    
    def info(self):
        print(self.color, self.name)
    
banana = Fruit("Banana", "Yellow")
banana.info()

đầu ra

Yellow Banana

Để hiểu cách thức hoạt động của tính năng này, hãy đi sâu hơn vào chi tiết về self trong Python

Hướng dẫn này dành cho những người đã biết về các lớp học nhưng khái niệm về bản thân còn hơi mơ hồ. Nếu bạn không quen với các lớp Python, vui lòng xem hướng dẫn này

Từ khóa 'bản thân' trong Python

Trong Python, một lớp là một kế hoạch chi tiết để tạo các đối tượng

Mỗi đối tượng Python là đại diện của một số lớp. Trong Python, một đối tượng còn được gọi là một thể hiện của một lớp. Nếu bạn muốn tạo một đối tượng trong Python, bạn cần phải có một lớp để từ đó bạn có thể tạo một đối tượng

Một lớp Python điển hình bao gồm các phương thức thực hiện các hành động dựa trên các thuộc tính được gán cho đối tượng

Chẳng hạn, hạng Trọng lượng có thể lưu trữ kilôgam và có khả năng chuyển đổi chúng thành pound

Trong một lớp Python, tham số self đề cập đến chính thể hiện của lớp. Điều này rất hữu ích vì nếu không sẽ không có cách nào để truy cập các thuộc tính và phương thức của lớp

Thí dụ. Lớp trái cây

Để hiểu rõ hơn về bản thân, chúng ta hãy xem một lớp Fruit đơn giản. Lớp Fruit này cho phép bạn tạo các đối tượng Fruit với tên và màu tùy chỉnh

class Fruit:
    def __init__(self, name, color):
        self.name = name
        self.color = color
    
    def info(self):
        print(self.color, self.name)

Bây giờ bạn có thể tạo các đối tượng Fruit theo cách này

banana = Fruit("Banana", "Yellow")
apple = Fruit("Apple", "Red")

Và bạn có thể hiển thị thông tin liên quan đến họ

banana.info()
apple.info()

đầu ra

Yellow Banana
Red Apple

Làm thế nào để 'bản thân' hoạt động trong ví dụ?

Hãy kiểm tra xem lớp Fruit này hoạt động như thế nào

Khi bạn tạo một đối tượng Fruit mới, phương thức __init__ được gọi dưới mui xe. Nó chịu trách nhiệm tạo ra các đối tượng. Hãy kiểm tra phương thức __init__ của lớp Fruit để xem chuyện gì đang xảy ra. Phải mất ba đối số

  1. bản thân
  2. Tên
  3. màu sắc

Khi bạn tạo một đối tượng Fruit, phương thức __init__ được gọi với tên và màu tùy chỉnh. Lưu ý cách bạn không cần chuyển self làm đối số. Python tự động làm điều đó cho bạn

Vì vậy, khi bạn gọi chuối = Trái cây(“Chuối”, “Đỏ”)

  • Phương thức __init__ bắt đầu khởi tạo đối tượng banana với các đối số tên và màu đã cho
  • Nó tự tạo ra các thuộc tính mới. tên và bản thân. color và lưu trữ tên đầu vào và màu sắc cho chúng
  • Sau này, có thể truy cập tên và các thuộc tính màu của chuối ở bất kỳ đâu trong đối tượng thông qua self. tên hoặc tự. màu sắc

Hãy cũng xem điều gì sẽ xảy ra khi bạn gọi chuối. thông tin()

Khi bạn gọi chuối. info(), Python sẽ tự động chuyển self vào lệnh gọi phương thức dưới dạng đối số bên trong. Phương thức info() sau đó có thể sử dụng self để truy cập các thuộc tính tên và màu của đối tượng. Không có bản thân, nó sẽ không thể làm điều đó

Lưu trữ mọi thứ cho chính mình trong Python

Trước đây, bạn đã thấy cách tham số self có thể được sử dụng để lưu trữ các thuộc tính cho các đối tượng

Cụ thể hơn, bạn đã thấy cách tiếp cận điển hình khi bạn chuyển các đối số của phương thức __init__ và gán chúng cho self bằng cách sử dụng cùng một tên

def __init__(self, name, color):
    self.name = name
    self.color = color

Điều này có thể đặt ra câu hỏi "Các tên đối số có phải bằng với tên được gán cho bản thân không?"

Tương tự như cách bạn có thể tạo bất kỳ biến nào ở bất kỳ đâu trong Python, bạn có thể gán bất kỳ thuộc tính nào cho một đối tượng thông qua self

Điều này có nghĩa là bạn có thể lưu trữ bất kỳ giá trị nào với bất kỳ tên nào để tự. Chúng thậm chí không cần phải được đưa ra làm đối số trong hàm __init__

Thí dụ

Ví dụ: hãy tạo một lớp Điểm đại diện cho một điểm trong không gian 3D. Hãy khởi tạo các đối tượng Point ở gốc mà không yêu cầu các điểm làm đối số khi khởi tạo

Để thực hiện việc này, hãy gán các giá trị x, y và z bằng 0 cho self trong phương thức __init__

class Point:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.z = 0

Bây giờ bạn có thể tạo các đối tượng Point tới gốc tọa độ

________số 8

đầu ra

0 0 0

Vấn đề ở đây là minh họa cách bạn có thể tự do thêm bất kỳ thuộc tính nào vào thuộc tính tự của đối tượng

Một phương thức không có đối số 'tự' trong lớp Python

Trong Python, một phương thức cần có đối số self. Mặt khác, nó không biết nó thuộc về lớp nào và không thể thực hiện các hành động trên nó

Để xem điều gì sẽ xảy ra nếu một phương thức không chấp nhận đối số self, hãy loại bỏ self khỏi phương thức info()

Yellow Banana
0

đầu ra

Yellow Banana
1

Dòng cuối cùng gợi ý rằng phương thức info() không có đối số, nhưng chúng tôi đã cung cấp cho nó một đối số. Nhưng dựa trên đoạn mã trên, có vẻ như bạn đã không đưa ra bất kỳ đối số nào. Vậy tại sao phiên dịch viên vẫn nghĩ rằng bạn đã cho nó một số?

Mặc dù bạn không cung cấp bất kỳ đối số nào cho phương thức info(), nhưng Python vẫn tự động cố gắng đưa self vào lệnh gọi. Điều này là do Python biết tất cả các phương thức trong một lớp cần phải có một tham chiếu đến chính lớp đó để hoạt động bình thường. Nhưng trong quá trình triển khai info() của chúng tôi, không có đối số self. Do đó, việc chuyển self đối số vào nó đằng sau hậu trường sẽ thất bại

Điều này cho bạn thấy rằng bạn cần sử dụng đối số self trong các phương thức

Bằng chứng rằng bản thân đề cập đến chính đối tượng

Để rõ ràng, hãy để tôi chứng minh rằng bản thân thực sự đề cập đến chính đối tượng

Để làm điều này, hãy kiểm tra vị trí bộ nhớ của self và một đối tượng Fruit

Trong Python, bạn có thể kiểm tra địa chỉ bộ nhớ của đối tượng bằng hàm id(). (Ở đây mình đã đơn giản hóa class Fruit để dễ hiểu hơn)

Yellow Banana
2

đầu ra

Yellow Banana
3

Như bạn có thể thấy, các địa chỉ bộ nhớ bằng nhau. Điều này cho bạn thấy rằng self bên trong lớp Fruit trỏ đến cùng một địa chỉ với đối tượng trái cây mà bạn vừa tạo. Nói cách khác, tham số self thực sự đề cập đến chính đối tượng

Bản thân không phải là từ khóa dành riêng trong Python

Lưu ý rằng self không phải là từ khóa dành riêng trong Python. Bạn có thể sử dụng bất kỳ tên nào bạn thích miễn là có một

Chẳng hạn, hãy thay đổi cách triển khai lớp Fruit từ các phần trước. Lần này, hãy sử dụng tên this thay vì self

Yellow Banana
4

Mã này hoạt động giống hệt như mã đã sử dụng self

Nhưng vì self được sử dụng phổ biến trong số các nhà phát triển Python, nên không nên sử dụng bất kỳ thứ gì khác. Bạn khó có thể gặp bất cứ thứ gì khác ngoài self khi làm việc với các lớp trong Python

Sự kết luận

Hôm nay bạn đã học self làm gì trong một lớp học Python

Tóm lại, self trong Python đề cập đến chính đối tượng đó. Nó rất hữu ích vì theo cách này, lớp biết cách truy cập các thuộc tính và phương thức của chính nó

Khi bạn tạo một đối tượng, phương thức __init__ được gọi. Trong phương thức này, bạn thường gán các thuộc tính cho thể hiện của lớp thông qua tự

Lưu ý cách self không phải là từ khóa dành riêng. Bạn có thể sử dụng bất cứ thứ gì thay vì self, miễn là bạn chuyển nó làm đối số đầu tiên cho mỗi phương thức của lớp. Tuy nhiên, self được sử dụng phổ biến đến mức bạn không nên sử dụng bất cứ thứ gì khác, mặc dù có thể

Điều gì xảy ra nếu bạn không sử dụng self trong Python?

Nếu không có đối số tự, thì cùng một lớp không thể chứa thông tin cho cả hai đối tượng này. Tuy nhiên, do class chỉ là bản thiết kế nên self cho phép truy cập các thuộc tính và phương thức của từng đối tượng trong python. Điều này cho phép mỗi đối tượng có các thuộc tính và phương thức riêng

Mục đích của self trong Python là gì?

Tham số self là tham chiếu đến phiên bản hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp .

Chúng ta có thể sử dụng bất cứ thứ gì thay vì tự Python không?

Ghi chú. Từ self không phải là một từ khóa, mà nó là một quy ước được sử dụng bởi các nhà phát triển Python. Bạn chỉ cần sử dụng bất kỳ từ nào khác làm tham số đầu tiên và từ đó vẫn sẽ thực hiện công việc . Tuy nhiên, tốt hơn là sử dụng self thay vì bất kỳ thứ gì khác vì nó cải thiện khả năng đọc mã.