Quá tải init python

Đôi khi bạn cần viết một lớp Python cung cấp nhiều cách để xây dựng các đối tượng. Nói cách khác, bạn muốn một lớp triển khai nhiều hàm tạo. Loại lớp này rất hữu ích khi bạn cần tạo các thể hiện bằng cách sử dụng các loại hoặc số lượng đối số khác nhau. Có các công cụ để cung cấp nhiều hàm tạo sẽ giúp bạn viết các lớp linh hoạt có thể thích ứng với các nhu cầu thay đổi

Trong Python, có một số kỹ thuật và công cụ mà bạn có thể sử dụng để xây dựng các lớp, bao gồm mô phỏng nhiều hàm tạo thông qua các đối số tùy chọn, tùy chỉnh việc tạo cá thể thông qua các phương thức lớp và thực hiện gửi đặc biệt với các trình trang trí. Nếu bạn muốn tìm hiểu về các kỹ thuật và công cụ này, thì hướng dẫn này là dành cho bạn

Trong hướng dẫn này, bạn sẽ học cách

  • Sử dụng các đối số tùy chọn và kiểm tra kiểu để mô phỏng nhiều hàm tạo
  • Viết nhiều hàm tạo bằng cách sử dụng trình trang trí
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    8 tích hợp
  • Quá tải các hàm tạo lớp của bạn bằng cách sử dụng trình trang trí
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    9

Bạn cũng sẽ có một cái nhìn sâu sắc về cách Python xây dựng các thể hiện bên trong của một lớp thông thường và cách một số lớp thư viện tiêu chuẩn cung cấp nhiều hàm tạo

Để tận dụng tối đa hướng dẫn này, bạn nên có kiến ​​thức cơ bản về lập trình hướng đối tượng và hiểu cách định nghĩa các phương thức lớp với

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8. Bạn cũng nên có kinh nghiệm làm việc với các trình trang trí trong Python

Tiền thưởng miễn phí. Nhấp vào đây để có quyền truy cập vào Bảng cheat Python OOP miễn phí chỉ cho bạn các hướng dẫn, video và sách hay nhất để tìm hiểu thêm về Lập trình hướng đối tượng với Python

Khởi tạo các lớp trong Python

Python hỗ trợ lập trình hướng đối tượng với các lớp dễ tạo và sử dụng. Các lớp Python cung cấp các tính năng mạnh mẽ có thể giúp bạn viết phần mềm tốt hơn. Các lớp giống như bản thiết kế cho các đối tượng, còn được gọi là thể hiện. Cũng giống như cách bạn có thể xây dựng nhiều ngôi nhà từ một bản thiết kế duy nhất, bạn có thể xây dựng một số phiên bản từ một lớp

Để định nghĩa một lớp trong Python, bạn cần sử dụng từ khóa theo sau là tên lớp

>>>

>>> # Define a Person class
>>> class Person:
..     def __init__[self, name]:
..         self.name = name
...

Python có một bộ phong phú mà bạn có thể sử dụng trong các lớp học của mình. Python gọi ngầm các phương thức đặc biệt để tự động thực thi nhiều loại thao tác trên các phiên bản. Có các phương thức đặc biệt để làm cho các đối tượng của bạn có thể lặp lại, cung cấp một biểu diễn chuỗi phù hợp cho các đối tượng của bạn, khởi tạo các thuộc tính thể hiện, v.v.

Một phương pháp đặc biệt khá phổ biến là. Phương thức này cung cấp cái được gọi là trình khởi tạo cá thể trong Python. Công việc của phương thức này là khởi tạo với các giá trị phù hợp khi bạn khởi tạo một lớp nhất định

Trong

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3, đối số đầu tiên của phương thức
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 được gọi là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
5. Đối số này giữ đối tượng hoặc thể hiện hiện tại, được truyền hoàn toàn trong lệnh gọi phương thức. Đối số này là phổ biến cho mọi trong Python. Đối số thứ hai của
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 được gọi là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
7 và sẽ giữ tên của người đó dưới dạng một chuỗi

Ghi chú. Sử dụng để đặt tên cho đối tượng hiện tại là một quy ước khá mạnh trong Python nhưng không bắt buộc. Tuy nhiên, việc sử dụng tên khác sẽ khiến các nhà phát triển Python đồng nghiệp của bạn phải nhướng mày

Khi bạn đã xác định một lớp, bạn có thể bắt đầu khởi tạo nó. Nói cách khác, bạn có thể bắt đầu tạo các đối tượng của lớp đó. Để làm điều này, bạn sẽ sử dụng một cú pháp quen thuộc. Chỉ cần gọi lớp bằng cách sử dụng một cặp dấu ngoặc đơn [

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
9], đây là cú pháp tương tự mà bạn sử dụng để gọi bất kỳ hàm Python nào

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
0

Trong Python, tên lớp cung cấp thứ mà các ngôn ngữ khác, chẳng hạn như C++ và Java, gọi hàm tạo của lớp. Gọi một lớp, giống như bạn đã làm với

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3, kích hoạt quy trình khởi tạo lớp của Python, quy trình này chạy nội bộ theo hai bước

  1. Tạo một thể hiện mới của lớp đích
  2. Khởi tạo thể hiện với các giá trị thuộc tính thể hiện phù hợp

Để tiếp tục với ví dụ trên, giá trị mà bạn chuyển làm đối số cho

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 được chuyển nội bộ cho
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 và sau đó được gán cho thuộc tính thể hiện
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
43. Bằng cách này, bạn khởi tạo phiên bản người của mình,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
44, với dữ liệu hợp lệ mà bạn có thể xác nhận bằng cách truy cập vào
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
43. Thành công.
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
46 thực sự là tên của anh ấy

Ghi chú. Khi bạn gọi lớp để tạo một thể hiện mới, bạn cần cung cấp bao nhiêu đối số mà

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 yêu cầu để phương thức này có thể khởi tạo tất cả các thuộc tính thể hiện yêu cầu một giá trị ban đầu

Bây giờ bạn đã hiểu cơ chế khởi tạo đối tượng, bạn đã sẵn sàng để tìm hiểu Python làm gì trước khi đến điểm này trong quy trình khởi tạo. Đã đến lúc tìm hiểu một phương pháp đặc biệt khác, được gọi là. Phương pháp này đảm nhiệm việc tạo các phiên bản mới trong Python

Ghi chú. Phương thức đặc biệt của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 thường được gọi là hàm tạo của lớp trong Python. Tuy nhiên, công việc của nó thực sự là tạo các đối tượng mới từ bản thiết kế lớp, vì vậy bạn có thể gọi nó chính xác hơn là trình tạo cá thể hoặc trình tạo đối tượng

Phương thức đặc biệt của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 lấy lớp bên dưới làm đối số đầu tiên của nó và trả về một đối tượng mới. Đối tượng này thường là một thể hiện của lớp đầu vào, nhưng trong một số trường hợp, nó có thể là một thể hiện của một lớp khác

Nếu đối tượng mà

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 trả về là một thể hiện của lớp hiện tại, thì thể hiện này ngay lập tức được chuyển đến
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 cho mục đích khởi tạo. Hai bước này chạy khi bạn gọi lớp

Lớp của Python cung cấp cơ sở hoặc triển khai mặc định của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 và
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2. Không giống như với
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2, bạn hiếm khi cần ghi đè lên
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 trong các lớp tùy chỉnh của mình. Hầu hết thời gian, bạn có thể yên tâm dựa vào triển khai mặc định của nó

Để tóm tắt những gì bạn đã học cho đến nay, quá trình khởi tạo của Python bắt đầu khi bạn gọi một lớp với các đối số thích hợp. Sau đó, quá trình chạy qua hai bước. tạo đối tượng bằng phương thức

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 và khởi tạo đối tượng bằng phương thức
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

Bây giờ bạn đã biết về hành vi bên trong này của Python, bạn đã sẵn sàng đi sâu vào việc cung cấp nhiều hàm tạo trong các lớp của mình. Nói cách khác, bạn sẽ cung cấp nhiều cách để xây dựng các đối tượng của một lớp Python nhất định

Loại bỏ các quảng cáo

Định nghĩa nhiều hàm tạo lớp

Đôi khi bạn muốn viết một lớp cho phép bạn xây dựng các đối tượng bằng cách sử dụng các đối số của các kiểu dữ liệu khác nhau hoặc thậm chí một số lượng đối số khác nhau. Một cách để đạt được điều này là cung cấp nhiều phương thức khởi tạo trong lớp. Mỗi hàm tạo sẽ cho phép bạn tạo các thể hiện của lớp bằng cách sử dụng một bộ đối số khác

Một số ngôn ngữ lập trình, chẳng hạn như C++, C# và Java, hỗ trợ cái được gọi là nạp chồng hàm hoặc phương thức. Tính năng này cho phép bạn cung cấp nhiều hàm tạo lớp vì nó cho phép bạn tạo nhiều hàm hoặc phương thức có cùng tên và các cách triển khai khác nhau

Nạp chồng phương thức có nghĩa là tùy thuộc vào cách bạn gọi phương thức hiện có, ngôn ngữ sẽ chọn triển khai phù hợp để chạy. Vì vậy, phương thức của bạn có thể thực hiện các tác vụ khác nhau tùy theo ngữ cảnh của cuộc gọi

Thật không may, Python không hỗ trợ nạp chồng hàm trực tiếp. Các lớp Python giữ các tên phương thức trong một từ điển nội bộ có tên là , chứa không gian tên lớp. Giống như bất kỳ từ điển Python nào,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
90 không thể có các khóa lặp lại, vì vậy bạn không thể có nhiều phương thức có cùng tên trong một lớp nhất định. Nếu bạn cố gắng làm như vậy, thì Python sẽ chỉ nhớ lần triển khai cuối cùng của phương thức trong tay

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]

Trong ví dụ này, bạn tạo

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
92 dưới dạng một lớp Python với hai phương thức. Cả hai phương thức đều có cùng tên, nhưng chúng có cách triển khai hơi khác nhau

Để tìm hiểu điều gì sẽ xảy ra khi hai phương thức có cùng tên, hãy lưu lớp của bạn vào tệp

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
93 trong thư mục làm việc của bạn và chạy đoạn mã sau trong một phiên tương tác

>>>

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]

Trong ví dụ này, bạn gọi

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
94 trên
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
95, đây là một thể hiện của lớp
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
92. Bạn nhận được
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
97 thay vì
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
98 trên màn hình, điều này xác nhận rằng phương pháp triển khai thứ hai chiếm ưu thế so với phương pháp đầu tiên

Dòng mã cuối cùng kiểm tra nội dung của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
90, phát hiện ra rằng tên của phương thức,
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
00, chỉ xuất hiện một lần trong không gian tên lớp. Điều này phù hợp với cách hoạt động của từ điển trong Python

Điều gì đó tương tự cũng xảy ra với các hàm trong mô-đun Python và trong phiên tương tác. Lần triển khai cuối cùng của một số chức năng có cùng tên chiếm ưu thế so với các lần triển khai còn lại

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
4

Bạn định nghĩa hai hàm có cùng tên,

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
01, trong cùng một phiên thông dịch. Tuy nhiên, định nghĩa thứ hai ghi đè định nghĩa đầu tiên. Khi bạn gọi hàm, bạn nhận được
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
97, điều này xác nhận rằng định nghĩa hàm cuối cùng chiếm ưu thế

Một kỹ thuật khác mà một số ngôn ngữ lập trình sử dụng để cung cấp nhiều cách gọi một phương thức hoặc hàm là gửi nhiều lần.

Với kỹ thuật này, bạn có thể viết một vài triển khai khác nhau của cùng một phương thức hoặc hàm và tự động gửi triển khai mong muốn theo loại hoặc các đặc điểm khác của đối số được sử dụng trong lệnh gọi. Bạn có thể sử dụng một vài công cụ từ thư viện tiêu chuẩn để kéo kỹ thuật này vào mã Python của mình

Python là một ngôn ngữ khá linh hoạt và giàu tính năng, đồng thời cung cấp một số cách để triển khai nhiều hàm tạo và làm cho các lớp của bạn linh hoạt hơn

Trong phần sau, bạn sẽ mô phỏng nhiều hàm tạo bằng cách truyền các đối số tùy chọn và bằng cách kiểm tra các loại đối số để xác định các hành vi khác nhau trong các trình khởi tạo cá thể của bạn

Mô phỏng nhiều hàm tạo trong các lớp của bạn

Một kỹ thuật khá hữu ích để mô phỏng nhiều hàm tạo trong một lớp Python là cung cấp cho

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 các đối số tùy chọn sử dụng các giá trị đối số mặc định. Bằng cách này, bạn có thể gọi hàm tạo của lớp theo nhiều cách khác nhau và nhận được một hành vi khác nhau mỗi lần

Một chiến lược khác là kiểm tra kiểu dữ liệu của các đối số đối với

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 để cung cấp các hành vi khác nhau tùy thuộc vào kiểu dữ liệu cụ thể mà bạn chuyển trong cuộc gọi. Kỹ thuật này cho phép bạn mô phỏng nhiều hàm tạo trong một lớp

Trong phần này, bạn sẽ tìm hiểu kiến ​​thức cơ bản về cách mô phỏng nhiều cách để xây dựng đối tượng bằng cách cung cấp các giá trị mặc định thích hợp cho các đối số của phương thức

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 và cũng bằng cách kiểm tra kiểu dữ liệu của các đối số cho phương thức này. Cả hai cách tiếp cận chỉ yêu cầu một lần triển khai
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

Loại bỏ các quảng cáo

Sử dụng các giá trị đối số tùy chọn trong
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

Một cách tao nhã và Pythonic để mô phỏng nhiều hàm tạo là triển khai phương thức

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 với các đối số tùy chọn. Bạn có thể làm điều này bằng cách xác định thích hợp

Ghi chú. Bạn cũng có thể cung cấp các đối số tùy chọn trong các hàm và phương thức của mình bằng cách sử dụng số lượng không xác định hoặc số lượng không xác định của. Kiểm tra Sử dụng đối số tùy chọn Python khi xác định hàm để biết thêm chi tiết về các tùy chọn này

Để đạt được điều này, giả sử bạn cần mã hóa một lớp nhà máy có tên là

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09. Lớp này sẽ tạo các đối tượng có thể gọi được để tính toán các công suất cụ thể, sử dụng một luồng số làm đầu vào. Bạn cũng cần lớp học của mình để theo dõi tổng số lũy thừa liên tiếp. Cuối cùng, lớp của bạn phải chấp nhận một đối số giữ giá trị ban đầu cho tổng các lũy thừa

Hãy tiếp tục và tạo một tệp

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
10 trong thư mục hiện tại của bạn. Sau đó nhập đoạn mã sau để thực hiện
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3

Trình khởi tạo của

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 nhận hai đối số tùy chọn,
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
13 và
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
14. Đối số đầu tiên chứa số mũ mà bạn sẽ sử dụng để tính một chuỗi lũy thừa. Nó mặc định là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
15, đây là giá trị thường được sử dụng khi nói đến sức mạnh tính toán

Dấu sao hoặc ký hiệu dấu hoa thị [

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
16] sau
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
13 có nghĩa là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
14 là một. Để chuyển một giá trị cho đối số chỉ có từ khóa, bạn cần sử dụng tên của đối số một cách rõ ràng. Nói cách khác, để đặt
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
19 thành
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20, bạn cần gõ rõ ràng
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
21

Đối số

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
14 giữ giá trị ban đầu để tính tổng lũy ​​thừa. Nó mặc định là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
23, đây là giá trị phù hợp cho những trường hợp bạn không có giá trị được tính toán trước đó để khởi tạo tổng lũy ​​thừa

Phương thức đặc biệt biến các phiên bản của

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 thành các đối tượng có thể gọi được. Nói cách khác, bạn có thể gọi các phiên bản của
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 giống như bạn gọi bất kỳ chức năng thông thường nào

Bên trong

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
24, trước tiên bạn tính lũy thừa của
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
28 được nâng lên thành
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
13. Sau đó, bạn thêm giá trị kết quả vào giá trị hiện tại của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
000. Cuối cùng, bạn trả lại công suất tính toán

Để dùng thử

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09, hãy mở phiên tương tác Python trong thư mục chứa
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
10 và chạy đoạn mã sau

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
9

Những ví dụ này cho thấy cách

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 mô phỏng nhiều hàm tạo. Ví dụ: hàm tạo đầu tiên không nhận đối số. Nó cho phép bạn tạo các thể hiện lớp tính toán lũy thừa của
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
15, là giá trị mặc định của đối số
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
13. Thuộc tính phiên bản
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
000 giữ tổng công suất được tính toán tích lũy khi bạn di chuyển

Ví dụ thứ hai cho thấy một hàm tạo lấy _____513 làm đối số và trả về một thể hiện có thể gọi được để tính toán các khối. Trong trường hợp này,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
000 hoạt động giống như trong ví dụ đầu tiên

Ví dụ thứ ba cho thấy dường như

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 có một hàm tạo khác cho phép bạn tạo các thể hiện bằng cách cung cấp các đối số
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
13 và
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
14. Bây giờ
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
000 bắt đầu với giá trị là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
013, giá trị này khởi tạo tổng các lũy thừa

Sử dụng các đối số tùy chọn khi bạn triển khai

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 trong các lớp của mình là một kỹ thuật rõ ràng và Pythonic để tạo các lớp mô phỏng nhiều hàm tạo

Kiểm tra các loại đối số trong
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

Một cách tiếp cận khác để mô phỏng nhiều hàm tạo là viết một phương thức

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 hoạt động khác nhau tùy thuộc vào loại đối số. Để kiểm tra kiểu của một biến trong Python, bạn thường dựa vào hàm có sẵn. Hàm này trả về
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
018 nếu một đối tượng là một thể hiện của một lớp đã cho và
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
019 nếu ngược lại

>>>

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
0

Đối số đầu tiên của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
017 là đối tượng mà bạn muốn gõ kiểm tra. Đối số thứ hai là lớp hoặc kiểu dữ liệu của tham chiếu. Bạn cũng có thể chuyển một bộ loại cho đối số này. Nếu bạn đang chạy Python 3. 10 trở lên, thì bạn cũng có thể sử dụng cú pháp hợp mới với ký hiệu đường ống [
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
021]

Bây giờ, hãy nói rằng bạn muốn tiếp tục làm việc với lớp

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 của mình và bạn cần lớp đó cũng chấp nhận ngày sinh của người đó. Mã của bạn sẽ biểu thị ngày sinh dưới dạng một đối tượng, nhưng để thuận tiện, người dùng của bạn cũng sẽ có tùy chọn cung cấp ngày sinh dưới dạng một chuỗi có định dạng nhất định. Trong trường hợp này, bạn có thể làm điều gì đó như sau

>>>

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
1

Bên trong

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2, trước tiên bạn xác định thuộc tính
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
43 thông thường. Mệnh đề
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
026 của câu lệnh điều kiện kiểm tra xem ngày sinh được cung cấp có phải là đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023 không. Nếu vậy, thì bạn xác định
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
028 để lưu trữ ngày hiện tại

Mệnh đề

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
029 kiểm tra xem đối số
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
030 có thuộc loại
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
031 không. Nếu vậy, thì bạn đặt
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
028 thành đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023 được tạo từ chuỗi được cung cấp. Lưu ý rằng đối số
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
030 phải là một chuỗi có ngày ở định dạng ISO, YYYY-MM-DD

Đó là nó. Bây giờ bạn có một phương thức

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2 mô phỏng một lớp có nhiều hàm tạo. Một hàm tạo nhận đối số kiểu
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023. Hàm tạo khác nhận các đối số kiểu chuỗi

Ghi chú. Nếu bạn đang chạy Python 3. 10 trở lên, thì bạn cũng có thể sử dụng để thực hiện kỹ thuật trong phần này

Kỹ thuật trong ví dụ trên có nhược điểm là nó không mở rộng tốt. Nếu bạn có nhiều đối số có thể nhận giá trị của các loại dữ liệu khác nhau, thì việc triển khai của bạn có thể sớm trở thành cơn ác mộng. Vì vậy, kỹ thuật này được coi là một anti-pattern trong Python

Ghi chú. PEP 443 tuyên bố rằng “…hiện tại mã Python là một mô hình phản đối phổ biến để kiểm tra các loại đối số nhận được, nhằm quyết định phải làm gì với các đối tượng. ” Mẫu mã hóa này “dễ gãy và không thể mở rộng”, theo cùng một tài liệu

Do đó, PEP 443 được giới thiệu để giúp bạn tránh sử dụng mô hình chống mã hóa này bất cứ khi nào có thể. Bạn sẽ tìm hiểu thêm về tính năng này trong phần

Ví dụ: điều gì sẽ xảy ra nếu người dùng của bạn nhập giá trị thời gian Unix cho

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
030?

>>>

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

Khi bạn truy cập vào

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
028, bạn nhận được thông báo vì câu lệnh điều kiện của bạn không có nhánh xem xét định dạng ngày khác

Để khắc phục sự cố này, bạn có thể tiếp tục thêm mệnh đề

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
029 để bao gồm tất cả các định dạng ngày có thể có mà người dùng có thể vượt qua. Bạn cũng có thể thêm mệnh đề
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
042 để nắm bắt các định dạng ngày không được hỗ trợ

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00

Trong ví dụ này, mệnh đề

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
042 sẽ chạy nếu giá trị của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
030 không phải là đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023 hoặc chuỗi chứa ngày ISO hợp lệ. Bằng cách này, tình huống đặc biệt không diễn ra trong im lặng

Loại bỏ các quảng cáo

Cung cấp nhiều hàm tạo với
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8 trong Python

Một kỹ thuật mạnh mẽ để cung cấp nhiều hàm tạo trong Python là sử dụng. Trình trang trí này cho phép bạn biến một phương thức thông thường thành một phương thức lớp

Không giống như các phương thức thông thường, các phương thức của lớp không lấy phiên bản hiện tại,

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
5, làm đối số. Thay vào đó, họ lấy chính lớp đó, thường được chuyển vào dưới dạng đối số
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049. Sử dụng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049 để đặt tên cho đối số này là một quy ước phổ biến trong cộng đồng Python

Đây là cú pháp cơ bản để định nghĩa một phương thức lớp

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
01

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
051 định nghĩa một phương thức lớp bằng cách sử dụng trình trang trí
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8 tích hợp sẵn của Python. Đối số đầu tiên của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
053 giữ chính lớp đó. Thông qua đối số này, bạn có thể truy cập lớp từ bên trong chính nó. Trong ví dụ này, bạn truy cập thuộc tính
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
054, lưu trữ tên của lớp bên dưới dưới dạng chuỗi

Điều quan trọng cần lưu ý là bạn có thể truy cập một phương thức của lớp bằng cách sử dụng lớp đó hoặc một thể hiện cụ thể của lớp đó. Bất kể bạn gọi

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
053 như thế nào, nó sẽ nhận được
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
051 làm đối số đầu tiên. Lý do cuối cùng khiến bạn có thể sử dụng các phương thức của lớp làm phương thức khởi tạo là vì bạn không cần một thể hiện để gọi một phương thức của lớp

Sử dụng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8 giúp bạn có thể thêm bao nhiêu hàm tạo rõ ràng mà bạn cần vào một lớp nhất định. Đó là một cách Pythonic và phổ biến để triển khai nhiều hàm tạo. Bạn cũng có thể gọi loại hàm tạo này là hàm tạo thay thế trong Python, như Raymond Hettinger đã làm trong bài nói chuyện PyCon của mình Bộ công cụ phát triển lớp Python

Bây giờ, làm cách nào bạn có thể sử dụng một phương thức lớp để tùy chỉnh quy trình khởi tạo của Python? . tạo và khởi tạo đối tượng. Thông qua các ví dụ sau, bạn sẽ học cách làm điều đó

Dựng Hình Tròn Từ Đường Kính Của Nó

Để tạo hàm tạo hạng nhất của bạn với

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8, giả sử bạn đang mã hóa một ứng dụng liên quan đến hình học và cần một lớp
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060. Ban đầu, bạn định nghĩa lớp của mình như sau

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
02

Trình khởi tạo của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 lấy giá trị bán kính làm đối số và lưu trữ nó trong một thuộc tính thể hiện có tên là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
062. Sau đó, lớp triển khai các phương thức để tính diện tích và chu vi của hình tròn bằng cách sử dụng mô-đun
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
063 của Python. Phương thức đặc biệt trả về một biểu diễn chuỗi phù hợp cho lớp của bạn

Hãy tiếp tục và tạo tệp

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
065 trong thư mục làm việc của bạn. Sau đó mở trình thông dịch Python và chạy đoạn mã sau để dùng thử
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
03

Mát mẻ. Lớp học của bạn hoạt động chính xác. Bây giờ giả sử rằng bạn cũng muốn khởi tạo

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 bằng cách sử dụng đường kính. Bạn có thể làm một cái gì đó như
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
068, nhưng điều đó không hoàn toàn Pythonic hoặc trực quan. Sẽ tốt hơn nếu có một hàm tạo thay thế để tạo các vòng tròn bằng cách sử dụng trực tiếp đường kính của chúng

Hãy tiếp tục và thêm phương thức lớp sau vào

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 ngay sau
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04

Ở đây, bạn định nghĩa

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
071 là một phương thức lớp. Đối số đầu tiên của nó nhận được một tham chiếu đến lớp chứa,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060

Đối số thứ hai giữ đường kính của hình tròn cụ thể mà bạn muốn tạo. Bên trong phương thức, trước tiên bạn tính bán kính bằng cách sử dụng giá trị đầu vào là

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
073. Sau đó, bạn khởi tạo
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 bằng cách gọi
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049 với bán kính xuất phát từ đối số
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
073

Bằng cách này, bạn có toàn quyền kiểm soát việc tạo và khởi tạo phiên bản của

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 bằng cách sử dụng đường kính làm đối số

Ghi chú. Trong ví dụ trên, bạn dường như có thể đạt được kết quả tương tự bằng cách gọi chính

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 thay vì
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049. Tuy nhiên, điều này có khả năng dẫn đến lỗi nếu lớp của bạn được phân lớp. Các lớp con đó sau đó sẽ gọi
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 thay vì gọi chính chúng khi chúng được khởi tạo với
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
071

Cuộc gọi đến đối số

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049 sẽ tự động chạy các bước khởi tạo và tạo đối tượng mà Python cần để khởi tạo một lớp. Cuối cùng,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
071 trả về phiên bản mới cho người gọi

Ghi chú. Một quy ước phổ biến trong cộng đồng Python là sử dụng giới từ

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
084 để đặt tên cho các hàm tạo mà bạn tạo làm phương thức lớp

Đây là cách bạn có thể sử dụng hàm tạo hoàn toàn mới của mình để tạo các vòng tròn bằng cách sử dụng đường kính

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
05

Cuộc gọi đến

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
071 trên
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 trả về một thể hiện mới của lớp. Để xây dựng thể hiện đó, phương thức sử dụng đường kính thay vì bán kính. Lưu ý rằng phần còn lại của chức năng của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
060 hoạt động giống như trước đây

Sử dụng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8 như bạn đã làm trong ví dụ trên là cách phổ biến nhất để cung cấp nhiều hàm tạo rõ ràng trong lớp của bạn. Với kỹ thuật này, bạn có tùy chọn để chọn đúng tên cho từng hàm tạo thay thế mà bạn cung cấp, điều này có thể làm cho mã của bạn dễ đọc và dễ bảo trì hơn

Loại bỏ các quảng cáo

Xây dựng một điểm cực từ tọa độ Descartes

Để có một ví dụ phức tạp hơn về việc cung cấp nhiều hàm tạo bằng các phương thức lớp, giả sử bạn có một lớp đại diện cho một điểm cực trong một ứng dụng liên quan đến toán học. Bạn cần một cách để làm cho lớp của bạn linh hoạt hơn để bạn cũng có thể xây dựng các thể hiện mới bằng cách sử dụng tọa độ Descartes

Đây là cách bạn có thể viết một hàm tạo để đáp ứng yêu cầu này

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
06

Trong ví dụ này,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
089 nhận hai đối số đại diện cho một điểm đã cho _______ 1090 và ________ 1091 tọa độ Descartes. Sau đó, phương thức tính toán
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
092 và
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
093 cần thiết để xây dựng đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
094 tương ứng. Cuối cùng,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
089 trả về một thể hiện mới của lớp

Đây là cách hoạt động của lớp, sử dụng cả hai hệ tọa độ

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
07

Trong các ví dụ này, bạn sử dụng quy trình khởi tạo tiêu chuẩn và phương thức khởi tạo thay thế của mình,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
089, để tạo các phiên bản
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
094 bằng cách sử dụng các đối số khởi tạo khác nhau về mặt khái niệm

Khám phá nhiều hàm tạo trong các lớp Python hiện có

Sử dụng trình trang trí

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
8 để cung cấp nhiều hàm tạo trong một lớp là một kỹ thuật khá phổ biến trong Python. Có một số ví dụ về các lớp thư viện chuẩn và tích hợp sử dụng kỹ thuật này để cung cấp nhiều hàm tạo thay thế

Trong phần này, bạn sẽ tìm hiểu về ba ví dụ đáng chú ý nhất của các lớp này.

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
099,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00, và

Xây dựng từ điển từ các phím

Từ điển là một kiểu dữ liệu cơ bản trong Python. Chúng có mặt trong mọi đoạn mã Python, rõ ràng hoặc ngầm định. Chúng cũng là nền tảng của ngôn ngữ vì các phần quan trọng của việc triển khai CPython dựa vào chúng

Bạn có một số cách để thể hiện trong Python. Bạn có thể sử dụng các từ trong từ điển, bao gồm các cặp khóa-giá trị trong dấu ngoặc nhọn [

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
02]. Bạn cũng có thể gọi
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
03 một cách rõ ràng bằng các đối số từ khóa hoặc bằng một chuỗi các bộ dữ liệu gồm hai mục, chẳng hạn

Lớp phổ biến này cũng thực hiện một hàm tạo thay thế được gọi là. Phương thức lớp này nhận một

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
05 khóa và một tùy chọn
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20. Đối số
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20 mặc định là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
08 và hoạt động như giá trị cho tất cả các khóa trong từ điển kết quả

Bây giờ, làm thế nào

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04 có thể hữu ích trong mã của bạn? . Ứng dụng của bạn sử dụng từ điển để lưu trữ kho động vật

Vì bạn đã biết loài nào bạn có khả năng nuôi ở nơi trú ẩn, nên bạn có thể tự động tạo từ điển kiểm kê ban đầu, giống như trong đoạn mã sau

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
08

Trong ví dụ này, bạn xây dựng một từ điển ban đầu bằng cách sử dụng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04, từ điển này lấy các khóa từ
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
11. Bạn đặt số lượng hàng tồn kho ban đầu của mỗi con vật là
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
23 bằng cách cung cấp giá trị này làm đối số thứ hai cho
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04

Như bạn đã biết,

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20 mặc định là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
08, đây có thể là giá trị ban đầu phù hợp cho các khóa từ điển của bạn trong một số trường hợp. Tuy nhiên, trong ví dụ trên,
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
23 là một giá trị thuận tiện vì bạn đang làm việc với số lượng cá thể mà bạn có từ mỗi loài

Ghi chú. Hầu hết thời gian, lớp

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
17 từ mô-đun
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
18 là một công cụ thích hợp hơn để giải quyết các vấn đề về hàng tồn kho như ở trên. Tuy nhiên,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
17 không cung cấp triển khai phù hợp của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04 để tránh sự mơ hồ như
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
21

Khác trong thư viện tiêu chuẩn cũng có một hàm tạo có tên là

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04. Đây là trường hợp của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
23,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
24, và. Ví dụ: của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
25 cung cấp cách triển khai sau của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
09

Ở đây,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
04 lấy một
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
05 và một
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20 làm đối số. Phương thức tạo một từ điển mới bằng cách gọi
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
049. Sau đó, nó lặp lại các khóa trong
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
05 và đặt từng giá trị thành
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
20, giá trị mặc định là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
08, như thường lệ. Cuối cùng, phương thức trả về từ điển mới được tạo

Loại bỏ các quảng cáo

Tạo đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00

Lớp

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00 từ thư viện chuẩn là một lớp khác tận dụng nhiều hàm tạo. Lớp này cung cấp một số hàm tạo thay thế, chẳng hạn như , , và. Tất cả chúng đều cho phép bạn xây dựng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00 đối tượng bằng cách sử dụng các đối số khác nhau về mặt khái niệm

Dưới đây là một số ví dụ về cách sử dụng một số hàm tạo đó để tạo đối tượng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
0

Ví dụ đầu tiên sử dụng hàm tạo của lớp tiêu chuẩn làm tham chiếu. Ví dụ thứ hai cho thấy cách bạn có thể sử dụng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
37 để xây dựng một đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023 từ ngày hiện tại

Các ví dụ còn lại cho thấy cách

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
00 sử dụng một số phương thức của lớp để cung cấp nhiều hàm tạo. Sự đa dạng của các hàm tạo này làm cho quá trình khởi tạo trở nên khá linh hoạt và mạnh mẽ, bao gồm nhiều trường hợp sử dụng khác nhau. Nó cũng cải thiện khả năng đọc mã của bạn với các tên phương thức mô tả

Tìm đường về nhà

Mô-đun

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
46 của Python từ thư viện tiêu chuẩn cung cấp các công cụ hiện đại và thuận tiện để xử lý các đường dẫn hệ thống trong mã của bạn một cách duyên dáng. Nếu bạn chưa bao giờ sử dụng mô-đun này, thì hãy xem Mô-đun pathlib của Python 3. Thuần hóa hệ thống tập tin

Công cụ hữu ích nhất trong

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
46 là lớp
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 của nó. Lớp này cho phép bạn xử lý đường dẫn hệ thống của mình theo cách đa nền tảng.
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 là một lớp thư viện tiêu chuẩn khác cung cấp nhiều hàm tạo. Ví dụ: bạn sẽ tìm thấy
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
50, tạo đối tượng đường dẫn từ thư mục chính của bạn

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
1

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
2

Hàm tạo

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
51 trả về một đối tượng đường dẫn mới đại diện cho thư mục chính của người dùng. Hàm tạo thay thế này có thể hữu ích khi bạn đang xử lý các tệp cấu hình trong các ứng dụng và dự án Python của mình

Cuối cùng,

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
48 cũng cung cấp một hàm tạo gọi là. Phương pháp này tạo một đối tượng đường dẫn từ thư mục làm việc hiện tại của bạn. Đi trước và cung cấp cho nó một thử

Cung cấp nhiều hàm tạo với
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
9

Kỹ thuật cuối cùng mà bạn sẽ học được gọi là. Với kỹ thuật này, bạn có thể thêm nhiều hàm tạo vào các lớp của mình và chạy chúng một cách có chọn lọc, tùy theo loại đối số đầu tiên của chúng

Một chức năng chung một lần gửi bao gồm nhiều chức năng thực hiện cùng một thao tác cho các loại dữ liệu khác nhau. Thuật toán điều phối cơ bản xác định triển khai nào sẽ chạy dựa trên loại của một đối số. Đó là nơi xuất phát của thuật ngữ công văn đơn lẻ

Bắt đầu với Python 3. 8, bạn có thể sử dụng trình trang trí hoặc để biến một hàm hoặc một phương thức tương ứng thành một hàm chung một lần gửi. PEP 443 giải thích rằng bạn có thể tìm thấy các bộ trang trí này trong mô-đun

Trong một hàm thông thường, Python chọn triển khai để gửi đi theo loại đối số đầu tiên của hàm. Trong một phương thức, đối số đích là đối số đầu tiên ngay sau

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
5

Một ví dụ demo về phương thức gửi một lần

Để áp dụng kỹ thuật phương thức gửi một lần cho một lớp nhất định, bạn cần xác định triển khai phương thức cơ sở và trang trí nó bằng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
9. Sau đó, bạn có thể viết các triển khai thay thế và trang trí chúng bằng tên của phương thức cơ sở cộng với
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
60

Đây là một ví dụ cho thấy cú pháp cơ bản

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
3

Trong

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
051, trước tiên bạn định nghĩa một phương thức cơ bản có tên là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
62 và trang trí nó bằng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
9. Sau đó, bạn xác định hai triển khai thay thế của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
62 và trang trí chúng bằng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
65

Trong ví dụ này, bạn đặt tên cho các triển khai thay thế bằng cách sử dụng một dấu gạch dưới [

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
66] làm tên trình giữ chỗ. Trong mã thực, bạn nên sử dụng các tên mô tả, miễn là chúng khác với tên phương thức cơ sở,
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
62. Khi sử dụng tên mô tả, hãy cân nhắc thêm dấu gạch dưới ở đầu để đánh dấu các phương thức thay thế là không công khai và ngăn các cuộc gọi trực tiếp từ người dùng cuối của bạn

Bạn có thể sử dụng để xác định loại đối số mục tiêu. Bạn cũng có thể chuyển loại đối số mục tiêu một cách rõ ràng cho trình trang trí

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
68. Nếu bạn cần xác định một phương thức để xử lý một số loại, thì bạn có thể xếp chồng nhiều lệnh gọi tới
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
68, với loại được yêu cầu cho mỗi loại

Đây là cách lớp học của bạn hoạt động

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
4

Nếu bạn gọi

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
70 với một số nguyên làm đối số, thì Python sẽ chạy triển khai tương ứng với loại
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
71. Tương tự, khi bạn gọi phương thức bằng một chuỗi, Python sẽ gửi triển khai chuỗi. Cuối cùng, nếu bạn gọi
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
70 với kiểu dữ liệu chưa đăng ký, chẳng hạn như danh sách, thì Python sẽ chạy triển khai cơ sở của phương thức

Bạn cũng có thể sử dụng kỹ thuật này để nạp chồng

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
2, điều này sẽ cho phép bạn cung cấp nhiều triển khai cho phương thức này và do đó, lớp của bạn sẽ có nhiều hàm tạo

Loại bỏ các quảng cáo

Một ví dụ thực tế về phương pháp gửi một lần

Như một ví dụ thực tế hơn về việc sử dụng

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
9, giả sử bạn cần tiếp tục thêm các tính năng vào lớp
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 của mình. Lần này, bạn cần cung cấp cách tính tuổi gần đúng của một người dựa trên ngày sinh của họ. Để thêm tính năng này vào
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3, bạn có thể sử dụng lớp trợ giúp xử lý tất cả thông tin liên quan đến ngày sinh và tuổi

Hãy tiếp tục và tạo một tệp có tên

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
77 trong thư mục làm việc của bạn. Sau đó thêm đoạn mã sau vào nó

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
5

Dưới đây là bảng phân tích về cách thức hoạt động của mã này

  • Dòng 3 nhập

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    023 từ
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    79 để sau này bạn có thể chuyển đổi bất kỳ ngày đầu vào nào thành đối tượng
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    023

  • Dòng 4 nhập

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    9 để xác định phương thức quá tải

  • Dòng 6 định nghĩa

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    82 là một lớp Python thông thường

  • Các dòng 7 đến 9 định nghĩa trình khởi tạo lớp là một phương thức chung gửi một lần bằng cách sử dụng

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    9. Đây là cách triển khai cơ sở của phương thức và nó làm tăng
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    84 đối với các định dạng ngày không được hỗ trợ

  • Dòng 11 đến 13 đăng ký triển khai

    >>> from greet import Greeter
    
    >>> greeter = Greeter[]
    
    >>> greeter.say_hello[]
    Hello, Pythonista
    
    >>> Greeter.__dict__
    mappingproxy[{..., 'say_hello': , ...}]
    
    2 xử lý trực tiếp các đối tượng
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    023

  • Các dòng 15 đến 17 xác định việc triển khai

    >>> from greet import Greeter
    
    >>> greeter = Greeter[]
    
    >>> greeter.say_hello[]
    Hello, Pythonista
    
    >>> Greeter.__dict__
    mappingproxy[{..., 'say_hello': , ...}]
    
    2 xử lý các ngày ở dạng chuỗi có định dạng ISO

  • Các dòng 19 đến 22 đăng ký một triển khai xử lý các ngày đến dưới dạng thời gian Unix tính bằng giây kể từ khi. Lần này, bạn đăng ký hai phiên bản của phương thức quá tải bằng cách xếp chồng trang trí

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    60 với và các loại

  • Các dòng 24 đến 25 cung cấp một phương pháp thông thường để tính tuổi của một người nhất định. Lưu ý rằng việc triển khai

    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    91 không hoàn toàn chính xác vì nó không tính đến tháng và ngày trong năm khi tính tuổi. Phương pháp
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    91 chỉ là một tính năng bổ sung để làm phong phú thêm ví dụ

Bây giờ bạn có thể sử dụng trong lớp

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 của mình để tận dụng lớp
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
82 mới. Hãy tiếp tục và cập nhật
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 với đoạn mã sau

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
6

Trong bản cập nhật này,

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 có một thuộc tính không công khai mới có tên là
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
97, đây là một phiên bản của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
82. Phiên bản này được khởi tạo với đối số đầu vào
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
030. Trình khởi tạo quá tải của
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
82 sẽ khởi tạo
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
97 theo ngày sinh của người dùng

Sau đó, bạn xác định

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
91 là thuộc tính để cung cấp thuộc tính được tính toán trả về tuổi gần đúng hiện tại của người đó. Phần bổ sung cuối cùng cho
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 là thuộc tính
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
04, trả về ngày sinh của người đó dưới dạng đối tượng
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
023

Để thử các lớp học

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 và
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
82 của bạn, hãy mở một phiên tương tác và chạy đoạn mã sau

>>>

# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
7

Bạn có thể khởi tạo

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 bằng các định dạng ngày khác nhau. Phiên bản nội bộ của
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
09 tự động chuyển đổi ngày đầu vào thành đối tượng ngày tháng. Nếu bạn khởi tạo
>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
3 với định dạng ngày không được hỗ trợ, chẳng hạn như từ điển, thì bạn sẽ nhận được một
# greet.py

class Greeter:
    def say_hello[self]:
        print["Hello, World"]

    def say_hello[self]:
        print["Hello, Pythonista"]
84

Lưu ý rằng

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
12 đảm nhận việc xử lý ngày sinh đầu vào cho bạn. Không cần sử dụng các hàm tạo thay thế rõ ràng để xử lý các loại đầu vào khác nhau. Bạn chỉ có thể khởi tạo lớp bằng cách sử dụng hàm tạo tiêu chuẩn

Hạn chế chính của kỹ thuật phương pháp gửi một lần là nó dựa trên một đối số duy nhất, đối số đầu tiên sau

>>> from greet import Greeter

>>> greeter = Greeter[]

>>> greeter.say_hello[]
Hello, Pythonista

>>> Greeter.__dict__
mappingproxy[{..., 'say_hello': , ...}]
5. Nếu bạn cần sử dụng nhiều đối số để gửi các triển khai phù hợp, hãy xem một số thư viện bên thứ ba hiện có, chẳng hạn như multidispatch và multimethod

Phần kết luận

Viết các lớp Python với nhiều hàm tạo có thể làm cho mã của bạn linh hoạt và linh hoạt hơn, bao gồm nhiều trường hợp sử dụng. Nhiều hàm tạo là một tính năng mạnh mẽ cho phép bạn xây dựng các thể hiện của lớp bên dưới bằng cách sử dụng các đối số thuộc các loại khác nhau, số lượng đối số khác nhau hoặc cả hai, tùy thuộc vào nhu cầu của bạn

Trong hướng dẫn này, bạn đã học cách

  • Mô phỏng nhiều hàm tạo bằng cách sử dụng đối số tùy chọn và kiểm tra kiểu
  • Viết nhiều hàm tạo bằng cách sử dụng trình trang trí
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    8 tích hợp
  • Quá tải các hàm tạo lớp của bạn bằng cách sử dụng trình trang trí
    # greet.py
    
    class Greeter:
        def say_hello[self]:
            print["Hello, World"]
    
        def say_hello[self]:
            print["Hello, Pythonista"]
    
    9

Bạn cũng đã học cách Python xây dựng các thể hiện bên trong của một lớp nhất định và cách một số lớp thư viện chuẩn cung cấp nhiều hàm tạo

Với kiến ​​thức này, giờ đây bạn có thể thêm gia vị cho các lớp của mình bằng nhiều hàm tạo, trang bị cho chúng một số cách để xử lý quy trình khởi tạo trong Python

Tiền thưởng miễn phí. Nhấp vào đây để có quyền truy cập vào Bảng cheat Python OOP miễn phí chỉ cho bạn các hướng dẫn, video và sách hay nhất để tìm hiểu thêm về Lập trình hướng đối tượng với Python

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Cung cấp nhiều hàm tạo trong các lớp Python của bạn

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Gửi cho tôi thủ thuật Python »

Giới thiệu về Leodanis Pozo Ramos

Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác

» Tìm hiểu thêm về Leodanis

Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Aldren

Bartosz

Geir Arne

kate

Sadie

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể quá tải Python init không?

Khái niệm nạp chồng phương thức và nạp chồng hàm tạo có thể thực hiện được trong các ngôn ngữ khác như java và c++. Trong hàm tạo và phương thức python, không thể quá tải .

Bạn có thể có nhiều __ init __ trong Python không?

Có một số cách mà một phương thức __init__ có thể được gọi nhiều lần . Có thể có nhiều hơn một lệnh gọi rõ ràng đến phương thức trong hệ thống phân cấp của các phương thức __init__. Một lớp sử dụng nhiều kế thừa gọi trực tiếp các phương thức __init__ của các kiểu cơ sở của nó.

Quá tải có nghĩa là gì trong Python?

Quá tải là khả năng một hàm hoặc toán tử hành xử theo những cách khác nhau dựa trên các tham số được truyền cho hàm hoặc toán hạng mà toán tử tác động lên. Some of the advantages of using overload are: Overloading a method fosters reusability.

Chúng ta có thể quá tải hàm tạo trong Python không?

Phương thức __init__[] được gọi là constructor và được gọi khi một đối tượng được tạo. Ở đây Quá tải hàm tạo có nghĩa là có nhiều hơn một hàm tạo trong một lớp có cùng tên nhưng với các đối số khác nhau

Chủ Đề