Tóm lược. trong hướng dẫn này, bạn sẽ học cách sử dụng phương thức
1 của Python để tạo biểu diễn chuỗi của một lớpCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Giới thiệu về phương thức person = Person['John', 'Doe', 25]
print[person]
Code language: Python [python]
1 của Python
person = Person['John', 'Doe', 25]
print[person]
Hãy bắt đầu với lớp
3Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Code language: Python [python]
class Person: def __init__[self, first_name, last_name, age]: self.first_name = first_name self.last_name = last_name self.age = age
Lớp
3 có ba thuộc tính thể hiện bao gồmCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
0,Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
1 vàCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
2Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Sau đây tạo một thể hiện mới của lớp
3 và hiển thị nóCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
đầu ra
Code language: Python [python]
Khi bạn sử dụng hàm
4 để hiển thị thể hiện của lớpCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
3, hàmCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
4 sẽ hiển thị địa chỉ bộ nhớ của thể hiện đó
person = Person['John', 'Doe', 25] print[person]
Code language: Python [python]
Đôi khi, thật hữu ích khi có một chuỗi đại diện cho một thể hiện của một lớp. Để tùy chỉnh biểu diễn chuỗi của một thể hiện lớp, lớp cần triển khai phương thức ma thuật
1Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Trong nội bộ, Python sẽ tự động gọi phương thức
1 khi một cá thể gọi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
9Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Lưu ý rằng hàm
4 chuyển đổi tất cả các đối số không phải từ khóa thành chuỗi bằng cách chuyển chúng tớiCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
9 trước khi hiển thị giá trị chuỗiCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Sau đây minh họa cách triển khai phương thức
1 trong lớpCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
3Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
1Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Và khi bạn sử dụng hàm
4 để in ra một thể hiện của lớpCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
3, Python sẽ gọi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
1 được định nghĩa trong lớpCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
3. Ví dụCode language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Python là ngôn ngữ hướng đối tượng, mọi thứ đều là đối tượng trong python. Python đang có loại phương thức đặc biệt được gọi là phương thức ma thuật được đặt tên với dấu gạch dưới kép ở trước và ở cuối
Khi chúng ta nói về phương pháp ma thuật __new__, chúng ta cũng cần nói về __init__
Các phương thức này sẽ được gọi khi bạn khởi tạo [Quá trình tạo thể hiện từ lớp được gọi là khởi tạo]. Đó là khi bạn tạo ví dụ. Phương thức ma thuật __new__ sẽ được gọi khi cá thể được tạo. Sử dụng phương pháp này, bạn có thể tùy chỉnh việc tạo cá thể. Đây chỉ là phương thức sẽ được gọi đầu tiên sau đó __init__ sẽ được gọi để khởi tạo thể hiện khi bạn đang tạo thể hiện
Phương thức __new__ sẽ lấy tham chiếu lớp làm đối số đầu tiên, theo sau là các đối số được truyền cho hàm tạo [Các đối số được truyền cho lệnh gọi của lớp để tạo cá thể]. Phương thức __new__ chịu trách nhiệm tạo đối tượng, vì vậy bạn có thể sử dụng phương thức này để tùy chỉnh việc tạo đối tượng. Thông thường, phương thức __new__ sẽ trả về tham chiếu đối tượng thể hiện đã tạo. Phương thức __init__ sẽ được gọi sau khi phương thức __new__ hoàn thành thực thi
Bạn có thể tạo thể hiện mới của lớp bằng cách gọi phương thức __new__ của lớp cha bằng super. Một cái gì đó như super[currentclass, cls]. __new__[cls, [,…. ]]
Khai báo và khởi tạo lớp thông thường
3Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Việc triển khai lớp với phương thức __new__ bị ghi đè
4Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
đầu ra
5Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Ghi chú
Bạn có thể tạo phiên bản bên trong phương thức __new__ bằng cách sử dụng siêu hàm hoặc bằng cách gọi trực tiếp phương thức __new__ trên đối tượng Nếu lớp cha mẹ là đối tượng. Đó là,
instance = super[MyClass, cls]. __new__[cls, *args, **kwargs]
hoặc
ví dụ = đối tượng. __new__[cls, *args, **kwargs]
Những điều cần ghi nhớ
Nếu __new__ trả về phiên bản của lớp của chính nó, thì phương thức __init__ của phiên bản mới được tạo sẽ được gọi với phiên bản đầu tiên [như __init__[self, [, …. ]] đối số theo sau bởi các đối số được chuyển đến __new__ hoặc lệnh gọi của lớp. Vì vậy, __init__ sẽ được gọi ngầm
Nếu phương thức __new__ trả về một thứ khác không phải là thể hiện của lớp, thì thể hiện của phương thức __init__ sẽ không được gọi. Trong trường hợp này, bạn phải tự gọi phương thức __init__
Các ứng dụng
Thông thường, việc ghi đè phương thức __new__ là không bình thường, nhưng đôi khi nó là bắt buộc nếu bạn đang viết API hoặc tùy chỉnh việc tạo lớp hoặc cá thể hoặc trừu tượng hóa thứ gì đó bằng cách sử dụng các lớp
Bạn có thể triển khai mẫu thiết kế singleton bằng phương thức __new__. Trong đó lớp singleton là một lớp chỉ có thể có một đối tượng. Đó là, thể hiện của lớp
Đây là cách bạn có thể hạn chế tạo nhiều phiên bản bằng cách ghi đè __new__
6Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Nó không giới hạn ở singleton. Bạn cũng có thể áp đặt giới hạn cho tổng số phiên bản đã tạo
7Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Tùy chỉnh đối tượng Instance
Bạn có thể tùy chỉnh phiên bản đã tạo và thực hiện một số thao tác trên phiên bản đó trước khi trình khởi tạo __init__ được gọi. Ngoài ra, bạn có thể áp đặt hạn chế đối với việc tạo phiên bản dựa trên một số ràng buộc
8Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Tùy chỉnh đối tượng được trả về
Thông thường khi bạn khởi tạo lớp, nó sẽ trả về thể hiện của lớp đó. Bạn có thể tùy chỉnh hành vi này và bạn có thể trả lại một số đối tượng ngẫu nhiên mà bạn muốn
Sau đây là một ví dụ đơn giản để chứng minh rằng việc trả về đối tượng ngẫu nhiên không phải là thể hiện của lớp
9Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
đầu ra
0Code language: Python [python]
person = Person['John', 'Doe', 25] print[person]
Ở đây, bạn có thể thấy khi chúng tôi khởi tạo lớp, nó trả về 3 thay vì tham chiếu phiên bản. Bởi vì chúng tôi đang trả về 3 thay vì phiên bản đã tạo từ phương thức __new__. Chúng tôi đang gọi __init__ một cách rõ ràng. Như tôi đã đề cập ở trên, chúng ta phải gọi __init__ một cách rõ ràng nếu chúng ta không trả về đối tượng thể hiện từ phương thức __new__
Phương thức __new__ cũng được sử dụng cùng với siêu lớp để tùy chỉnh việc tạo lớp
Phần kết luận
Có nhiều khả năng về cách bạn có thể sử dụng tính năng này. Hầu như không phải lúc nào cũng cần ghi đè phương thức __new__ trừ khi bạn đang làm gì đó liên quan đến việc tạo cá thể
Đơn giản tốt hơn phức tạp. Cố gắng làm cho cuộc sống dễ dàng hơn, chỉ sử dụng phương pháp này nếu cần sử dụng