Python sử dụng self bên ngoài lớp học

Khi bạn bắt đầu học python, bạn sẽ bắt gặp thuật ngữ “bản thân”. Từ khóa được gọi là “self” dùng để sử dụng các thuộc tính và phương thức trong một lớp. Ở đây, trong bài viết này, hãy cùng chúng tôi tìm hiểu sâu về self và biết khi nào nên sử dụng nó. ‘Tuy nhiên, trước đó, hãy cho chúng tôi biết các chủ đề chúng tôi sẽ đề cập ở đây

  • Tại sao lại sử dụng Self trong Python?
  • Việc sử dụng Self trong python có quan trọng không?
  • Trình tự xây dựng lớp Python?
  • Bản thân trong Python có phải là từ khóa không?

Tại sao lại sử dụng self trong python?

Từ khóa self dùng để biểu diễn thể hiện của lớp. Trước khi tìm hiểu sâu hơn về chủ đề chính của chúng ta, hãy nhớ lại biến thể hiện và biến lớp. Các biến lớp được chia sẻ với các thể hiện [đối tượng] được tạo với lớp cụ thể

Bây giờ, quay lại chủ đề chính của chúng ta. Bản thân là để truy cập các thuộc tính và phương thức của lớp. Nó liên kết các thuộc tính đó với đối số. Trong python, chúng ta có thể sử dụng các phương thức để truyền cá thể tự động, nhưng không tự động nhận

Ví dụ

Class phone[]:

def __init__[self, model, color]:

self.model = model

self.color = color

def show[self]:

print["Model is", self.model ]

print["color is", self.color ]

samsung= phone [“samsung”, “black”]

redmi= phone[“redmi”, “white”]

samsung.show[]

redmi.show[]

đầu ra

Model is Samsung

Color is black

Model is redmi

Color is white

Việc sử dụng bản thân trong Python có quan trọng không?

Như đã nói trước đó, thể hiện tự đại diện của lớp. Không giống như các ngôn ngữ khác, khi bạn tạo một đối tượng mới, nó không tạo các phương thức thể hiện. Do đó, phương thức cá thể xuất hiện dưới đối tượng. Tốt nhất là tiết kiệm bộ nhớ

Trình tự xây dựng lớp Python

Bạn cũng có thể sử dụng self để chỉ một trường biến trong lớp. Hãy xem một ví dụ

 class School:

 def __init__[self, Stella]:

self.name = Stella

 def get_person_name[self]:

return self.name

Ở đây, self chỉ biến [tên] của lớp [trường]. Tên là biến chỉ được sử dụng khi phương thức đang chạy và chỉ cục bộ đối với phương thức. Muốn khai báo biến toàn cục thì khai báo ngoài class

Bây giờ, chúng ta hãy chuyển sang tìm hiểu liệu bản thân có phải là một từ khóa hay không

Cái tôi có phải là một từ khóa không?

Không. Bản thân không phải là một từ khóa. Trong một hàm, self là một tham số và người dùng có thể sử dụng bất kỳ tham số nào khác thay vì self. Tuy nhiên, tốt hơn là sử dụng self vì nó giúp tăng khả năng đọc mã

Ví dụ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]

đầu ra

Say hello to everyone

Với điều này, chúng tôi đã kết thúc hướng dẫn của mình. Nếu có bất kỳ nghi ngờ hoặc yêu cầu làm rõ, sau đó, đừng ngần ngại liên hệ với chúng tôi

Các lớp cung cấp phương tiện kết hợp dữ liệu và chức năng với nhau. Tạo một lớp mới sẽ tạo ra một loại đối tượng mới, cho phép tạo các thể hiện mới của loại đó. Mỗi thể hiện của lớp có thể có các thuộc tính gắn liền với nó để duy trì trạng thái của nó. Các thể hiện của lớp cũng có thể có các phương thức [được định nghĩa bởi lớp của nó] để sửa đổi trạng thái của nó

So với các ngôn ngữ lập trình khác, cơ chế lớp của Python thêm các lớp với cú pháp và ngữ nghĩa mới tối thiểu. Nó là sự kết hợp của các cơ chế lớp có trong C++ và Modula-3. Các lớp Python cung cấp tất cả các tính năng tiêu chuẩn của Lập trình hướng đối tượng. cơ chế kế thừa lớp cho phép nhiều lớp cơ sở, một lớp dẫn xuất có thể ghi đè bất kỳ phương thức nào của lớp cơ sở hoặc các lớp của nó và một phương thức có thể gọi phương thức của lớp cơ sở có cùng tên. Các đối tượng có thể chứa số lượng và loại dữ liệu tùy ý. Điều này đúng với các mô-đun, các lớp tham gia vào bản chất động của Python. chúng được tạo trong thời gian chạy và có thể được sửa đổi thêm sau khi tạo

Theo thuật ngữ C++, thông thường các thành viên của lớp [bao gồm cả thành viên dữ liệu] là công khai [ngoại trừ xem bên dưới Biến riêng ] và tất cả các hàm thành viên . Như trong Modula-3, không có cách viết tắt nào để tham chiếu các thành viên của đối tượng từ các phương thức của nó. chức năng phương pháp được khai báo với một đối số đầu tiên rõ ràng đại diện cho đối tượng, được cung cấp ngầm bởi cuộc gọi. Như trong Smalltalk, bản thân các lớp là các đối tượng. Điều này cung cấp ngữ nghĩa để nhập và đổi tên. Không giống như C++ và Modula-3, các kiểu dựng sẵn có thể được sử dụng làm lớp cơ sở cho phần mở rộng của người dùng. Ngoài ra, giống như trong C++, hầu hết các toán tử tích hợp sẵn với cú pháp đặc biệt [toán tử số học, chỉ số con, v.v. ] có thể được định nghĩa lại cho các thể hiện của lớp.

[Thiếu thuật ngữ được chấp nhận rộng rãi để nói về các lớp, thỉnh thoảng tôi sẽ sử dụng thuật ngữ Smalltalk và C++. Tôi sẽ sử dụng thuật ngữ Modula-3, vì ngữ nghĩa hướng đối tượng của nó gần với ngữ nghĩa của Python hơn C++, nhưng tôi hy vọng rằng ít độc giả đã nghe nói về nó. ]

9. 1. Đôi lời về tên và đối tượng¶

Các đối tượng có tính riêng biệt và nhiều tên [trong nhiều phạm vi] có thể được liên kết với cùng một đối tượng. Điều này được gọi là bí danh trong các ngôn ngữ khác. Điều này thường không được đánh giá cao trong cái nhìn đầu tiên về Python và có thể được bỏ qua một cách an toàn khi xử lý các loại cơ bản không thay đổi [số, chuỗi, bộ dữ liệu]. Tuy nhiên, bí danh có thể có tác động đáng ngạc nhiên đối với ngữ nghĩa của mã Python liên quan đến các đối tượng có thể thay đổi như danh sách, từ điển và hầu hết các loại khác. Điều này thường được sử dụng vì lợi ích của chương trình, vì bí danh hoạt động giống như con trỏ ở một số khía cạnh. Ví dụ, việc truyền một đối tượng là rẻ vì quá trình thực hiện chỉ truyền một con trỏ;

9. 2. Phạm vi Python và không gian tên¶

Trước khi giới thiệu các lớp học, trước tiên tôi phải nói với bạn đôi điều về quy tắc phạm vi của Python. Định nghĩa lớp chơi một số thủ thuật gọn gàng với không gian tên và bạn cần biết cách phạm vi và không gian tên hoạt động để hiểu đầy đủ những gì đang diễn ra. Ngẫu nhiên, kiến ​​thức về chủ đề này rất hữu ích cho bất kỳ lập trình viên Python nâng cao nào

Hãy bắt đầu với một số định nghĩa

Một không gian tên là ánh xạ từ tên đến đối tượng. Hầu hết các không gian tên hiện được triển khai dưới dạng từ điển Python, nhưng điều đó thường không đáng chú ý theo bất kỳ cách nào [ngoại trừ hiệu suất] và nó có thể thay đổi trong tương lai. Ví dụ về không gian tên là. tập hợp các tên dựng sẵn [chứa các hàm như

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
0 và các tên ngoại lệ dựng sẵn]; . Theo một nghĩa nào đó, tập hợp các thuộc tính của một đối tượng cũng tạo thành một không gian tên. Điều quan trọng cần biết về các không gian tên là hoàn toàn không có mối quan hệ nào giữa các tên trong các không gian tên khác nhau;

Nhân tiện, tôi sử dụng thuộc tính từ cho bất kỳ tên nào sau dấu chấm — ví dụ: trong biểu thức

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
2,
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
3 là một thuộc tính của đối tượng
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
4. Nói một cách chính xác, các tham chiếu đến tên trong các mô-đun là các tham chiếu thuộc tính. trong biểu thức
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
5,
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
6 là một đối tượng mô-đun và
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
7 là một thuộc tính của nó. Trong trường hợp này, có một ánh xạ đơn giản giữa các thuộc tính của mô-đun và tên chung được xác định trong mô-đun. họ chia sẻ cùng một không gian tên. 1

Các thuộc tính có thể là chỉ đọc hoặc ghi. Trong trường hợp sau, có thể gán cho các thuộc tính. Thuộc tính mô-đun có thể ghi. bạn có thể viết

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
8. Các thuộc tính có thể ghi cũng có thể bị xóa bằng câu lệnh
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
9. Ví dụ:
Model is Samsung

Color is black

Model is redmi

Color is white
50 sẽ xóa thuộc tính
Model is Samsung

Color is black

Model is redmi

Color is white
51 khỏi đối tượng được đặt tên bởi
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
6

Không gian tên được tạo tại các thời điểm khác nhau và có thời gian tồn tại khác nhau. Không gian tên chứa tên dựng sẵn được tạo khi trình thông dịch Python khởi động và không bao giờ bị xóa. Không gian tên chung cho một mô-đun được tạo khi định nghĩa mô-đun được đọc vào; . Các câu lệnh được thực thi bởi lời gọi cấp cao nhất của trình thông dịch, được đọc từ tệp tập lệnh hoặc tương tác, được coi là một phần của mô-đun có tên là

Model is Samsung

Color is black

Model is redmi

Color is white
53, vì vậy chúng có không gian tên chung của riêng chúng. [Các tên dựng sẵn thực sự cũng tồn tại trong một mô-đun; cái này được gọi là
Model is Samsung

Color is black

Model is redmi

Color is white
54. ]

Không gian tên cục bộ cho một hàm được tạo khi hàm được gọi và bị xóa khi hàm trả về hoặc đưa ra một ngoại lệ không được xử lý trong hàm. [Thật ra, quên sẽ là cách tốt hơn để mô tả những gì thực sự xảy ra. ] Tất nhiên, mỗi lời gọi đệ quy đều có không gian tên cục bộ của riêng chúng

Phạm vi là một vùng văn bản của chương trình Python nơi không gian tên có thể truy cập trực tiếp. “Có thể truy cập trực tiếp” ở đây có nghĩa là một tham chiếu không đủ tiêu chuẩn đến một tên cố gắng tìm tên đó trong không gian tên

Mặc dù phạm vi được xác định tĩnh nhưng chúng được sử dụng động. Bất cứ lúc nào trong quá trình thực thi, có 3 hoặc 4 phạm vi lồng nhau có không gian tên có thể truy cập trực tiếp

  • phạm vi trong cùng, được tìm kiếm đầu tiên, chứa tên địa phương

  • phạm vi của bất kỳ chức năng kèm theo nào, được tìm kiếm bắt đầu bằng phạm vi kèm theo gần nhất, chứa các tên không cục bộ, nhưng cũng không phải toàn cầu

  • phạm vi next-to-last chứa tên chung của mô-đun hiện tại

  • phạm vi ngoài cùng [được tìm kiếm cuối cùng] là không gian tên chứa các tên dựng sẵn

Nếu một tên được khai báo là toàn cầu, thì tất cả các tham chiếu và phép gán sẽ chuyển trực tiếp đến phạm vi tiếp theo chứa tên toàn cục của mô-đun. Để liên kết lại các biến được tìm thấy bên ngoài phạm vi trong cùng, có thể sử dụng câu lệnh

Model is Samsung

Color is black

Model is redmi

Color is white
55;

Thông thường, phạm vi cục bộ tham chiếu tên cục bộ của hàm hiện tại [theo văn bản]. Các chức năng bên ngoài, phạm vi cục bộ tham chiếu cùng một không gian tên với phạm vi toàn cầu. không gian tên của mô-đun. Định nghĩa lớp đặt một không gian tên khác trong phạm vi cục bộ

Điều quan trọng là phải nhận ra rằng phạm vi được xác định theo văn bản. phạm vi toàn cầu của một chức năng được xác định trong một mô-đun là không gian tên của mô-đun đó, bất kể chức năng được gọi từ đâu hoặc bằng bí danh nào. Mặt khác, việc tìm kiếm tên thực tế được thực hiện một cách linh hoạt, trong thời gian chạy — tuy nhiên, định nghĩa ngôn ngữ đang phát triển theo hướng phân giải tên tĩnh, tại thời điểm “biên dịch”, vì vậy đừng dựa vào độ phân giải tên động. [Thực tế, các biến cục bộ đã được xác định tĩnh. ]

Một điều đặc biệt của Python là – nếu không có câu lệnh

Model is Samsung

Color is black

Model is redmi

Color is white
56 hoặc
Model is Samsung

Color is black

Model is redmi

Color is white
55 nào có hiệu lực – việc gán tên luôn đi vào phạm vi trong cùng. Bài tập không sao chép dữ liệu — chúng chỉ liên kết tên với đối tượng. Điều này cũng đúng với việc xóa. câu lệnh
Model is Samsung

Color is black

Model is redmi

Color is white
58 xóa ràng buộc của
Model is Samsung

Color is black

Model is redmi

Color is white
59 khỏi không gian tên được tham chiếu bởi phạm vi cục bộ. Trên thực tế, tất cả các hoạt động giới thiệu tên mới đều sử dụng phạm vi cục bộ. đặc biệt, các câu lệnh
 class School:

 def __init__[self, Stella]:

self.name = Stella

 def get_person_name[self]:

return self.name
50 và định nghĩa hàm liên kết tên mô-đun hoặc hàm trong phạm vi cục bộ

Câu lệnh

Model is Samsung

Color is black

Model is redmi

Color is white
56 có thể được sử dụng để chỉ ra rằng các biến cụ thể tồn tại trong phạm vi toàn cầu và sẽ được phục hồi ở đó;

9. 2. 1. Ví dụ về phạm vi và không gian tên¶

Đây là một ví dụ minh họa cách tham chiếu các phạm vi và không gian tên khác nhau cũng như cách

Model is Samsung

Color is black

Model is redmi

Color is white
56 và
Model is Samsung

Color is black

Model is redmi

Color is white
55 ảnh hưởng đến liên kết biến

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
0

Đầu ra của mã ví dụ là

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
1

Lưu ý cách gán cục bộ [mặc định] không thay đổi ràng buộc spam của scope_test. Nhiệm vụ

Model is Samsung

Color is black

Model is redmi

Color is white
55 đã thay đổi ràng buộc thư rác của scope_test và nhiệm vụ
Model is Samsung

Color is black

Model is redmi

Color is white
56 đã thay đổi ràng buộc cấp mô-đun

Bạn cũng có thể thấy rằng trước đó không có ràng buộc nào đối với thư rác trước khi gán

Model is Samsung

Color is black

Model is redmi

Color is white
56

9. 3. Cái nhìn đầu tiên về lớp học¶

Các lớp giới thiệu một chút cú pháp mới, ba loại đối tượng mới và một số ngữ nghĩa mới

9. 3. 1. Cú pháp định nghĩa lớp¶

Hình thức định nghĩa lớp đơn giản nhất trông như thế này

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
5

Định nghĩa lớp, như định nghĩa hàm [

 class School:

 def __init__[self, Stella]:

self.name = Stella

 def get_person_name[self]:

return self.name
58 câu lệnh] phải được thực thi trước khi chúng có hiệu lực. [Bạn có thể đặt một định nghĩa lớp trong một nhánh của câu lệnh
 class School:

 def __init__[self, Stella]:

self.name = Stella

 def get_person_name[self]:

return self.name
59 hoặc bên trong một hàm. ]

Trong thực tế, các câu lệnh bên trong một định nghĩa lớp thường sẽ là các định nghĩa hàm, nhưng các câu lệnh khác được cho phép và đôi khi hữu ích — chúng ta sẽ quay lại vấn đề này sau. Các định nghĩa hàm bên trong một lớp thường có một dạng danh sách đối số đặc biệt, được quy định bởi các quy ước gọi phương thức — một lần nữa, điều này sẽ được giải thích sau

Khi một định nghĩa lớp được nhập, một không gian tên mới được tạo và được sử dụng làm phạm vi cục bộ — do đó, tất cả các phép gán cho các biến cục bộ đều đi vào vùng tên mới này. Cụ thể, các định nghĩa hàm liên kết tên của hàm mới tại đây

Khi một định nghĩa lớp được để lại bình thường [thông qua phần cuối], một đối tượng lớp được tạo. Về cơ bản, đây là một trình bao bọc xung quanh nội dung của không gian tên được tạo bởi định nghĩa lớp; . Phạm vi cục bộ ban đầu [phạm vi có hiệu lực ngay trước khi định nghĩa lớp được nhập] được khôi phục và đối tượng lớp được liên kết ở đây với tên lớp được đưa ra trong tiêu đề định nghĩa lớp [trong ví dụ ___150]

9. 3. 2. Đối tượng lớp¶

Các đối tượng lớp hỗ trợ hai loại hoạt động. tham chiếu thuộc tính và khởi tạo

Tham chiếu thuộc tính sử dụng cú pháp tiêu chuẩn được sử dụng cho tất cả các tham chiếu thuộc tính trong Python.

Model is Samsung

Color is black

Model is redmi

Color is white
51. Tên thuộc tính hợp lệ là tất cả các tên có trong không gian tên của lớp khi đối tượng lớp được tạo. Vì vậy, nếu định nghĩa lớp trông như thế này

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'

thì

Model is Samsung

Color is black

Model is redmi

Color is white
52 và
Model is Samsung

Color is black

Model is redmi

Color is white
53 là các tham chiếu thuộc tính hợp lệ, trả về một số nguyên và một đối tượng hàm tương ứng. Thuộc tính lớp cũng có thể được gán cho, vì vậy bạn có thể thay đổi giá trị của
Model is Samsung

Color is black

Model is redmi

Color is white
52 bằng cách gán.
Model is Samsung

Color is black

Model is redmi

Color is white
55 cũng là một thuộc tính hợp lệ, trả về chuỗi tài liệu thuộc về lớp.
Model is Samsung

Color is black

Model is redmi

Color is white
56

Khởi tạo lớp sử dụng ký hiệu hàm. Chỉ giả vờ rằng đối tượng lớp là một hàm không tham số trả về một thể hiện mới của lớp. Ví dụ [giả sử lớp trên]

Model is Samsung

Color is black

Model is redmi

Color is white
5

tạo một thể hiện mới của lớp và gán đối tượng này cho biến cục bộ

Model is Samsung

Color is black

Model is redmi

Color is white
59

Thao tác khởi tạo [“gọi” một đối tượng lớp] tạo một đối tượng trống. Nhiều lớp muốn tạo các đối tượng với các thể hiện được tùy chỉnh theo trạng thái ban đầu cụ thể. Do đó, một lớp có thể định nghĩa một phương thức đặc biệt có tên là

Model is Samsung

Color is black

Model is redmi

Color is white
58, như thế này

 class School:

 def __init__[self, Stella]:

self.name = Stella

 def get_person_name[self]:

return self.name
5

Khi một lớp định nghĩa một phương thức

Model is Samsung

Color is black

Model is redmi

Color is white
58, việc khởi tạo lớp sẽ tự động gọi
Model is Samsung

Color is black

Model is redmi

Color is white
58 cho thể hiện của lớp mới được tạo. Vì vậy, trong ví dụ này, một phiên bản mới, được khởi tạo có thể được lấy bằng cách

Model is Samsung

Color is black

Model is redmi

Color is white
5

Tất nhiên, phương pháp

Model is Samsung

Color is black

Model is redmi

Color is white
58 có thể có các đối số để linh hoạt hơn. Trong trường hợp đó, các đối số được cung cấp cho toán tử khởi tạo lớp được chuyển đến
Model is Samsung

Color is black

Model is redmi

Color is white
58. Ví dụ,

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
5

9. 3. 3. Đối tượng dụ¶

Bây giờ chúng ta có thể làm gì với các đối tượng ví dụ? . Có hai loại tên thuộc tính hợp lệ. thuộc tính dữ liệu và phương thức

thuộc tính dữ liệu tương ứng với “biến thể hiện” trong Smalltalk và với “thành viên dữ liệu” trong C++. Thuộc tính dữ liệu không cần khai báo; . Ví dụ: nếu

Model is Samsung

Color is black

Model is redmi

Color is white
59 là phiên bản của
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
54 được tạo ở trên, đoạn mã sau sẽ in giá trị
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
55 mà không để lại dấu vết

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
9

Một loại tham chiếu thuộc tính thể hiện khác là một phương thức. Một phương thức là một hàm “thuộc về” một đối tượng. [Trong Python, thuật ngữ phương thức không phải là duy nhất đối với các thể hiện của lớp. các loại đối tượng khác cũng có thể có các phương thức. Ví dụ: các đối tượng danh sách có các phương thức được gọi là chắp thêm, chèn, xóa, sắp xếp, v.v. Tuy nhiên, trong cuộc thảo luận sau đây, chúng ta sẽ chỉ sử dụng thuật ngữ phương thức để chỉ các phương thức của các đối tượng thể hiện của lớp, trừ khi có quy định rõ ràng khác. ]

Tên phương thức hợp lệ của một đối tượng thể hiện phụ thuộc vào lớp của nó. Theo định nghĩa, tất cả các thuộc tính của một lớp là các đối tượng hàm xác định các phương thức tương ứng của các thể hiện của nó. Vì vậy, trong ví dụ của chúng ta,

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
56 là một tham chiếu phương thức hợp lệ, vì
Model is Samsung

Color is black

Model is redmi

Color is white
53 là một hàm, nhưng
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
58 thì không, vì
Model is Samsung

Color is black

Model is redmi

Color is white
52 không phải là. Nhưng
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
56 không giống với
Model is Samsung

Color is black

Model is redmi

Color is white
53 — nó là đối tượng phương thức, không phải đối tượng hàm

9. 3. 4. Đối tượng phương thức¶

Thông thường, một phương thức được gọi ngay sau khi nó bị ràng buộc

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
6

Trong ví dụ về

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
54, điều này sẽ trả về chuỗi
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
93. Tuy nhiên, không nhất thiết phải gọi ngay một phương thức.
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
56 là một đối tượng phương thức và có thể được lưu trữ và gọi sau. Ví dụ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
10

sẽ tiếp tục in

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
95 cho đến hết thời gian

Chính xác thì điều gì sẽ xảy ra khi một phương thức được gọi? . Điều gì đã xảy ra với cuộc tranh luận?

Trên thực tế, bạn có thể đã đoán được câu trả lời. điều đặc biệt về các phương thức là đối tượng thể hiện được truyền làm đối số đầu tiên của hàm. Trong ví dụ của chúng tôi, cuộc gọi

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
96 hoàn toàn tương đương với
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
99. Nói chung, việc gọi một phương thức có danh sách n đối số tương đương với việc gọi hàm tương ứng có danh sách đối số được tạo bằng cách chèn đối tượng thể hiện của phương thức trước đối số đầu tiên

Nếu bạn vẫn không hiểu cách thức hoạt động của các phương pháp, hãy xem cách triển khai có thể làm sáng tỏ vấn đề. Khi một thuộc tính phi dữ liệu của một thể hiện được tham chiếu, lớp của thể hiện được tìm kiếm. Nếu tên biểu thị một thuộc tính lớp hợp lệ là một đối tượng hàm, thì một đối tượng phương thức được tạo bằng cách đóng gói [con trỏ tới] đối tượng thể hiện và đối tượng hàm vừa được tìm thấy cùng nhau trong một đối tượng trừu tượng. đây là đối tượng phương thức. Khi đối tượng phương thức được gọi với danh sách đối số, danh sách đối số mới được tạo từ đối tượng thể hiện và danh sách đối số, đồng thời đối tượng hàm được gọi với danh sách đối số mới này

9. 3. 5. Biến lớp và trường hợp¶

Nói chung, các biến thể hiện dành cho dữ liệu duy nhất cho từng thể hiện và các biến lớp dành cho các thuộc tính và phương thức được chia sẻ bởi tất cả các thể hiện của lớp

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
11

Như đã thảo luận trong Đôi lời về tên và đối tượng , dữ liệu được chia sẻ có thể có những tác động đáng ngạc nhiên khi liên quan đến mutable objects such as lists and dictionaries. For example, the tricks list in the following code should not be used as a class variable because just a single list would be shared by all Dog instances:

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
12

Thay vào đó, thiết kế đúng của lớp nên sử dụng một biến thể hiện

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
13

9. 4. Nhận xét ngẫu nhiên¶

Nếu cùng một tên thuộc tính xảy ra trong cả một phiên bản và trong một lớp, thì việc tra cứu thuộc tính sẽ ưu tiên phiên bản đó

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
14

Các thuộc tính dữ liệu có thể được tham chiếu bởi các phương thức cũng như bởi những người dùng thông thường [“khách hàng”] của một đối tượng. Nói cách khác, các lớp không thể sử dụng để triển khai các kiểu dữ liệu trừu tượng thuần túy. Trên thực tế, không có gì trong Python có thể thực thi ẩn dữ liệu — tất cả đều dựa trên quy ước. [Mặt khác, việc triển khai Python, được viết bằng C, hoàn toàn có thể ẩn các chi tiết triển khai và kiểm soát quyền truy cập vào một đối tượng nếu cần; điều này có thể được sử dụng bởi các phần mở rộng cho Python được viết bằng C. ]

Khách hàng nên sử dụng các thuộc tính dữ liệu một cách cẩn thận - khách hàng có thể làm rối tung các bất biến được duy trì bởi các phương thức bằng cách đóng dấu vào các thuộc tính dữ liệu của họ. Lưu ý rằng các máy khách có thể thêm các thuộc tính dữ liệu của riêng chúng vào một đối tượng thể hiện mà không ảnh hưởng đến tính hợp lệ của các phương thức, miễn là tránh xung đột về tên — một lần nữa, quy ước đặt tên có thể giúp bạn đỡ phải đau đầu hơn ở đây

Không có cách viết tắt để tham chiếu các thuộc tính dữ liệu [hoặc các phương thức khác. ] từ bên trong phương pháp. Tôi thấy rằng điều này thực sự làm tăng khả năng đọc của các phương pháp. không có khả năng nhầm lẫn giữa biến cục bộ và biến thể hiện khi lướt qua một phương thức

Thông thường, đối số đầu tiên của một phương thức được gọi là

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
60. Đây không gì khác hơn là một quy ước. cái tên
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
60 hoàn toàn không có ý nghĩa đặc biệt nào đối với Python. Tuy nhiên, lưu ý rằng bằng cách không tuân theo quy ước, mã của bạn có thể khó đọc hơn đối với các lập trình viên Python khác và cũng có thể hình dung rằng một chương trình trình duyệt lớp có thể được viết dựa trên quy ước đó

Bất kỳ đối tượng hàm nào là thuộc tính của lớp đều định nghĩa một phương thức cho các thể hiện của lớp đó. Không nhất thiết định nghĩa hàm phải được đính kèm theo văn bản trong định nghĩa lớp. gán một đối tượng hàm cho một biến cục bộ trong lớp cũng được. Ví dụ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
15

Bây giờ

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
62,
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
63 và
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
64 là tất cả các thuộc tính của lớp
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
65 đề cập đến các đối tượng hàm và do đó, chúng là tất cả các phương thức của các thể hiện của
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
65 -
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
64 hoàn toàn tương đương với
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
63. Lưu ý rằng cách làm này thường chỉ gây nhầm lẫn cho người đọc chương trình

Các phương thức có thể gọi các phương thức khác bằng cách sử dụng các thuộc tính phương thức của đối số

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
60

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
16

Các phương thức có thể tham chiếu các tên toàn cục giống như các hàm thông thường. Phạm vi toàn cầu được liên kết với một phương thức là mô-đun chứa định nghĩa của nó. [Một lớp không bao giờ được sử dụng như một phạm vi toàn cầu. ] Mặc dù người ta hiếm khi gặp lý do chính đáng để sử dụng dữ liệu toàn cầu trong một phương thức, nhưng có nhiều cách sử dụng hợp pháp phạm vi toàn cầu. đối với một điều, các hàm và mô-đun được nhập vào phạm vi toàn cầu có thể được sử dụng bởi các phương thức, cũng như các hàm và lớp được định nghĩa trong đó. Thông thường, lớp chứa phương thức tự nó được định nghĩa trong phạm vi toàn cục này, và trong phần tiếp theo, chúng ta sẽ tìm thấy một số lý do chính đáng khiến một phương thức muốn tham chiếu đến lớp của chính nó

Mỗi giá trị là một đối tượng và do đó có một lớp [còn được gọi là loại của nó]. Nó được lưu trữ dưới dạng

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
100

9. 5. Kế thừa¶

Tất nhiên, một tính năng ngôn ngữ sẽ không xứng với cái tên “đẳng cấp” nếu không hỗ trợ tính kế thừa. Cú pháp cho một định nghĩa lớp dẫn xuất trông như thế này

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
17

Tên

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
101 phải được định nghĩa trong phạm vi chứa định nghĩa lớp dẫn xuất. Thay cho tên lớp cơ sở, các biểu thức tùy ý khác cũng được phép. Điều này có thể hữu ích, ví dụ, khi lớp cơ sở được định nghĩa trong một mô-đun khác

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
18

Việc thực thi định nghĩa lớp dẫn xuất tiến hành giống như đối với lớp cơ sở. Khi đối tượng lớp được xây dựng, lớp cơ sở được ghi nhớ. Điều này được sử dụng để giải quyết các tham chiếu thuộc tính. nếu không tìm thấy thuộc tính được yêu cầu trong lớp, quá trình tìm kiếm sẽ tiếp tục tìm trong lớp cơ sở. Quy tắc này được áp dụng đệ quy nếu bản thân lớp cơ sở được dẫn xuất từ ​​một số lớp khác

Không có gì đặc biệt về việc khởi tạo các lớp dẫn xuất.

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
102 tạo một thể hiện mới của lớp. Tham chiếu phương thức được giải quyết như sau. thuộc tính lớp tương ứng được tìm kiếm, giảm dần chuỗi các lớp cơ sở nếu cần và tham chiếu phương thức hợp lệ nếu điều này mang lại một đối tượng hàm

Các lớp dẫn xuất có thể ghi đè các phương thức của các lớp cơ sở của chúng. Bởi vì các phương thức không có đặc quyền đặc biệt khi gọi các phương thức khác của cùng một đối tượng, nên một phương thức của lớp cơ sở gọi một phương thức khác được định nghĩa trong cùng một lớp cơ sở có thể sẽ gọi một phương thức của lớp dẫn xuất ghi đè lên nó. [Dành cho lập trình viên C++. tất cả các phương thức trong Python đều có hiệu quả

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
103. ]

Trên thực tế, một phương thức ghi đè trong lớp dẫn xuất có thể muốn mở rộng hơn là chỉ thay thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi trực tiếp phương thức của lớp cơ sở. chỉ cần gọi

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
104. Điều này đôi khi cũng hữu ích cho khách hàng. [Lưu ý rằng điều này chỉ hoạt động nếu lớp cơ sở có thể truy cập là
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
101 trong phạm vi toàn cầu. ]

Python có hai hàm tích hợp hoạt động với tính kế thừa

  • Sử dụng

    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    106 để kiểm tra loại phiên bản.
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    107 sẽ chỉ là
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    108 nếu
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    109 là
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    110 hoặc một số lớp bắt nguồn từ
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    110

  • Sử dụng

    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    112 để kiểm tra tính kế thừa của lớp.
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    113 là
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    108 vì
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    115 là phân lớp của
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    110. Tuy nhiên,
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    117 là
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    118 vì
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    119 không phải là lớp con của
    class hello:
    
    def show[bye]:
    
    print["Say hello to everyone"]
    
    object = hello[]
    
    object.show[]
    110

9. 5. 1. Đa kế thừa¶

Python cũng hỗ trợ một dạng đa kế thừa. Một định nghĩa lớp với nhiều lớp cơ sở trông như thế này

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
19

Đối với hầu hết các mục đích, trong những trường hợp đơn giản nhất, bạn có thể coi việc tìm kiếm các thuộc tính được kế thừa từ lớp cha là tìm kiếm theo chiều sâu, từ trái sang phải, không phải tìm kiếm hai lần trong cùng một lớp khi có sự chồng chéo trong hệ thống phân cấp. Do đó, nếu một thuộc tính không được tìm thấy trong

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
121, nó sẽ được tìm kiếm trong
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
122, sau đó [đệ quy] trong các lớp cơ sở của
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
122 và nếu nó không được tìm thấy ở đó, nó sẽ được tìm kiếm trong
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
124, v.v.

Trên thực tế, nó phức tạp hơn thế một chút; . Cách tiếp cận này được biết đến trong một số ngôn ngữ đa kế thừa khác là phương thức gọi tiếp theo và mạnh hơn siêu lệnh gọi được tìm thấy trong các ngôn ngữ kế thừa đơn

Thứ tự động là cần thiết vì tất cả các trường hợp đa thừa kế đều thể hiện một hoặc nhiều mối quan hệ kim cương [trong đó ít nhất một trong các lớp cha có thể được truy cập thông qua nhiều đường dẫn từ lớp dưới cùng]. Ví dụ: tất cả các lớp kế thừa từ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
126, vì vậy bất kỳ trường hợp đa thừa kế nào cũng cung cấp nhiều hơn một đường dẫn để đến
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
126. Để giữ cho các lớp cơ sở không bị truy cập nhiều lần, thuật toán động tuyến tính hóa thứ tự tìm kiếm theo cách duy trì thứ tự từ trái sang phải được chỉ định trong mỗi lớp, gọi mỗi cha chỉ một lần và đó là đơn điệu [có nghĩa là . Được kết hợp với nhau, các thuộc tính này giúp thiết kế các lớp đáng tin cậy và có thể mở rộng với nhiều kế thừa. Để biết thêm chi tiết, xem https. //www. con trăn. org/tải xuống/phát hành/2. 3/mro/

9. 6. Biến riêng¶

Các biến thể hiện “Riêng tư” không thể truy cập được ngoại trừ từ bên trong một đối tượng không tồn tại trong Python. Tuy nhiên, có một quy ước được tuân theo bởi hầu hết mã Python. một tên bắt đầu bằng dấu gạch dưới [e. g.

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
128] phải được coi là một phần không công khai của API [cho dù đó là hàm, phương thức hay thành viên dữ liệu]. Nó nên được coi là một chi tiết thực hiện và có thể thay đổi mà không cần thông báo

Vì có một trường hợp sử dụng hợp lệ cho các thành viên lớp-riêng [cụ thể là để tránh xung đột tên của các tên với các tên được xác định bởi các lớp con], nên có một số hỗ trợ hạn chế cho một cơ chế như vậy, được gọi là xáo trộn tên. Bất kỳ mã định danh nào có dạng

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
129 [ít nhất hai dấu gạch dưới ở đầu, nhiều nhất là một dấu gạch dưới ở cuối] được thay thế bằng văn bản bằng
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
130, trong đó
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
131 là tên lớp hiện tại với [các] dấu gạch dưới ở đầu bị loại bỏ. Việc xáo trộn này được thực hiện mà không cần quan tâm đến vị trí cú pháp của mã định danh, miễn là nó xảy ra trong định nghĩa của một lớp

Xáo trộn tên rất hữu ích để cho phép các lớp con ghi đè các phương thức mà không phá vỡ các cuộc gọi phương thức nội bộ. Ví dụ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
50

Ví dụ trên sẽ hoạt động ngay cả khi

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
132 giới thiệu mã định danh
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
133 vì nó được thay thế bằng
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
134 trong lớp
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
135 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
136 trong lớp
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
132 tương ứng

Lưu ý rằng các quy tắc xáo trộn được thiết kế chủ yếu để tránh tai nạn; . Điều này thậm chí có thể hữu ích trong các trường hợp đặc biệt, chẳng hạn như trong trình gỡ lỗi

Lưu ý rằng mã được chuyển đến

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
138 hoặc
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
139 không coi tên lớp của lớp đang gọi là lớp hiện tại; . Hạn chế tương tự áp dụng cho
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
141,
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
142 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
143, cũng như khi tham chiếu trực tiếp đến
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
144

9. 7. Tỷ lệ cược và Kết quả¶

Đôi khi sẽ rất hữu ích khi có một kiểu dữ liệu tương tự như Pascal “record” hoặc C “struct”, kết hợp một vài mục dữ liệu đã đặt tên lại với nhau. Cách tiếp cận thành ngữ là sử dụng

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
145 cho mục đích này

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
51

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
52

Thay vào đó, một đoạn mã Python mong đợi một kiểu dữ liệu trừu tượng cụ thể có thể được chuyển qua một lớp mô phỏng các phương thức của kiểu dữ liệu đó. Chẳng hạn, nếu bạn có một hàm định dạng một số dữ liệu từ một đối tượng tệp, bạn có thể định nghĩa một lớp bằng các phương thức

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
146 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
147 thay vào đó lấy dữ liệu từ bộ đệm chuỗi và chuyển nó làm đối số

Các đối tượng phương thức sơ thẩm cũng có các thuộc tính.

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
148 là đối tượng thể hiện với phương thức
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
149 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
150 là đối tượng hàm tương ứng với phương thức

9. 8. Trình lặp¶

Bây giờ bạn có thể nhận thấy rằng hầu hết các đối tượng vùng chứa có thể được lặp lại bằng cách sử dụng câu lệnh

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
151

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
53

Phong cách truy cập này rõ ràng, ngắn gọn và thuận tiện. Việc sử dụng các trình lặp tràn ngập và thống nhất Python. Đằng sau hậu trường, câu lệnh

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
151 gọi
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
153 trên đối tượng chứa. Hàm trả về một đối tượng iterator xác định phương thức
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154 truy cập từng phần tử trong vùng chứa. Khi không còn phần tử nào nữa,
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154 sẽ đưa ra một ngoại lệ
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
156 báo cho vòng lặp
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
151 kết thúc. Bạn có thể gọi phương thức
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154 bằng cách sử dụng chức năng tích hợp sẵn
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
159;

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
54

Đã xem cơ chế đằng sau giao thức trình lặp, thật dễ dàng để thêm hành vi của trình lặp vào các lớp của bạn. Xác định một phương thức

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
160 trả về một đối tượng bằng một phương thức
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154. Nếu lớp định nghĩa
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154, thì
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
160 chỉ có thể trả về
class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'
60

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
55

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
56

9. 9. Máy phát điện¶

Trình tạo là một công cụ đơn giản và mạnh mẽ để tạo trình vòng lặp. Chúng được viết giống như các hàm thông thường nhưng sử dụng câu lệnh

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
165 bất cứ khi nào chúng muốn trả về dữ liệu. Mỗi lần
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
159 được gọi trên nó, trình tạo sẽ tiếp tục ở nơi nó đã dừng lại [nó nhớ tất cả các giá trị dữ liệu và câu lệnh nào được thực hiện lần cuối]. Một ví dụ cho thấy rằng các trình tạo có thể dễ dàng tạo ra.

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
57

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
58

Bất cứ điều gì có thể được thực hiện với trình tạo cũng có thể được thực hiện với trình vòng lặp dựa trên lớp như được mô tả trong phần trước. Điều làm cho các trình tạo trở nên nhỏ gọn là các phương thức

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
160 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
154 được tạo tự động

Một tính năng quan trọng khác là các biến cục bộ và trạng thái thực thi được lưu tự động giữa các lần gọi. Điều này làm cho hàm dễ viết hơn và rõ ràng hơn nhiều so với cách tiếp cận sử dụng các biến thể hiện như

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
169 và
class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
170

Ngoài việc tạo phương thức tự động và lưu trạng thái chương trình, khi các trình tạo kết thúc, chúng sẽ tự động tăng

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
156. Kết hợp lại, các tính năng này giúp dễ dàng tạo các trình vòng lặp mà không tốn nhiều công sức hơn là viết một hàm thông thường

9. 10. Biểu thức trình tạo¶

Một số trình tạo đơn giản có thể được mã hóa ngắn gọn dưới dạng biểu thức bằng cách sử dụng cú pháp tương tự như cách hiểu danh sách nhưng có dấu ngoặc đơn thay vì dấu ngoặc vuông. Các biểu thức này được thiết kế cho các tình huống mà trình tạo được sử dụng ngay lập tức bởi một hàm kèm theo. Các biểu thức trình tạo nhỏ gọn hơn nhưng kém linh hoạt hơn các định nghĩa trình tạo đầy đủ và có xu hướng thân thiện với bộ nhớ hơn so với việc hiểu danh sách tương đương

ví dụ

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
59

chú thích

1

Ngoại trừ một điều. Các đối tượng mô-đun có thuộc tính chỉ đọc bí mật được gọi là

class hello:

def show[bye]:

print["Say hello to everyone"]

object = hello[]

object.show[]
144, thuộc tính này trả về từ điển được sử dụng để triển khai không gian tên của mô-đun; . Rõ ràng, việc sử dụng điều này vi phạm tính trừu tượng của việc triển khai không gian tên và nên được hạn chế đối với những thứ như trình gỡ lỗi sau khi chết

Bạn có thể sử dụng self bên ngoài lớp Python không?

Biến được định nghĩa bên trong lớp. Ví dụ – bản thân. var_name. Nếu bạn muốn sử dụng biến đó ngay cả bên ngoài lớp, bạn phải khai báo biến đó là biến toàn cục . Sau đó, biến có thể được truy cập bằng cách sử dụng tên của nó bên trong và bên ngoài lớp và không sử dụng thể hiện của lớp.

Bạn có thể sử dụng một chức năng bên ngoài một lớp trong lớp đó không?

Bạn cũng có thể chỉ cần sao chép một hàm được định nghĩa bên ngoài lớp vào lớp và sử dụng nó như một phương thức thông thường [không có bộ trang trí hoặc .

Chúng ta có thể truy cập biến lớp bằng cách sử dụng bản thân không?

Có, bạn có thể truy cập biến lớp bằng chính mình .

Bạn có thể gán lại bản thân trong Python không?

self chỉ là một tham chiếu đến thể hiện hiện tại trong phương thức. Bạn không thể thay đổi phiên bản của mình bằng cách tự đặt .

Chủ Đề