class Singleton[object]: _instance = None # Keep instance reference def __new__[cls, *args, **kwargs]: if not cls._instance: cls._instance = object.__new__[cls, *args, **kwargs] return cls._instance7 là trong siêu dữ liệu. Siêu lớp đủ phức tạp để xứng đáng với bài viết của riêng chúng, vì vậy tôi không đề cập đến chúng ở đây. Nếu bạn đã hiểu về siêu dữ liệu, thật tuyệt. Nếu không, đừng lo lắng;
Xin chào các chuyên viên máy tính và chào mừng trong bài viết hôm nay, chúng tôi sẽ đề cập đến Python mới. Cùng với đó, chúng ta sẽ xem xét định nghĩa và ứng dụng của phương pháp này. Chúng tôi sẽ làm tất cả điều đó với sự giúp đỡ của các ví dụ. Như chúng ta biết rằng python là một ngôn ngữ lập trình cấp cao. Với sự trợ giúp của nó, chúng ta cũng có thể lập trình hướng đối tượng. Trong Python, có một số phương thức đặc biệt được gọi là phương thức ma thuật hoặc phương thức gạch dưới kép. Chúng là những phương thức được sử dụng phổ biến trong nạp chồng toán tử. Nó có thể được hiểu là một điều kiện trong đó các toán tử khác nhau có cách triển khai khác nhau tùy thuộc vào đối số của chúng
Một điều khác phân biệt phương pháp ma thuật với phương pháp thông thường là chúng có các hậu tố và tiền tố của dấu gạch dưới kép xung quanh chúng. Giống như __new__ , __add__, __init__ và v.v. Trong bài viết này, chúng tôi sẽ chủ yếu tập trung vào phương pháp ma thuật __new__. Hơn nữa trong bài viết này, tôi sẽ sử dụng new thay vì __new__
nội dung
Phương thức __new__ của Python và cú pháp của nó
Trong phần này, chúng ta sẽ cố gắng hiểu phương pháp mới thực sự là gì. Cùng với đó, chúng ta cũng sẽ xem xét cú pháp của nó. Để phát triển một sự hiểu biết đầy đủ về phương pháp này
Trong lập trình hướng đối tượng bất cứ khi nào một lớp đã khởi tạo phương thức new được gọi. Phương thức mới được gọi khi một đối tượng được tạo và là một phương thức tĩnh. Một tham số cls. cls được yêu cầu để đi qua nó. Tại thời điểm khởi tạo, trình biên dịch sẽ tự lo liệu. Tiếp theo, chúng ta hãy xem cú pháp của phương thức này
cú pháp
class class_name: def __new__[cls, *args, **kwargs]: print[] return super[class_name, cls].__new__[cls, *args, **kwargs]
Đây là cú pháp chung của phương pháp mới. Ở đây chúng ta đã sử dụng super với câu lệnh return. Chúng tôi sử dụng nó vì nó trả về một đối tượng tạm thời và cho phép chúng tôi truy cập các phương thức của lớp cơ sở. Trong phần tiếp theo, chúng ta hãy xem xét một số ví dụ liên quan đến nó
Ví dụ về Python __new__
class A[object]: def __new__[cls]: print["EXAMPLE-1"] return super[A, cls].__new__[cls] A[]
đầu ra
EXAMPLE-1
Ở trên, chúng ta có thể thấy ví dụ đầu tiên liên quan đến phương thức mới. Ở đây chúng tôi đã không làm gì lạ mắt và động cơ duy nhất là thực hiện đúng cú pháp. Ở đây chúng tôi đã xác định một đối tượng. Bên trong nó, chúng ta đã định nghĩa một lớp mới. Sau đó, chúng tôi đã sử dụng một bản in đơn giản và trả lại siêu. Cuối cùng, chúng ta chỉ cần gọi đối tượng
import math class A[object]: def __new__[cls]: a=input["enter the number"] b=input["enter the number"] c=int[a]+int[b] print[c] return super[A, cls].__new__[cls] A[]
đầu ra
enter the number 7
enter the number 9
16
Trong ví dụ này, chúng ta đã thực hiện phép cộng 2 số. Ở đây chúng tôi đã lấy đầu vào từ người dùng. Phần còn lại, chúng tôi vừa làm theo cú pháp liên quan. Từ 2 ví dụ đã thảo luận ở trên, chúng ta có thể kết luận rằng phương thức mới được gọi tự động. Cũng như câu lệnh return super nên được sử dụng khi xử lý các phương thức ma thuật
Sự khác biệt giữa các phương thức ma thuật __new__ và __init__ của Python
Cho đến nay trong bài viết này, chúng tôi đã thảo luận về phương pháp ma thuật mới. Phương thức __int__ cũng được tự động thêm vào khi một lớp được khởi tạo. Ở đây, sự khác biệt giữa 2 là phương thức init được sử dụng để khởi tạo đối tượng. Ngoài ra, khi cả hai phương thức đều có mặt trong trường hợp đó, lần đầu tiên việc thực thi phương thức mới diễn ra. Sau đó, quyết định có sử dụng phương thức init hay không. Hãy để chúng tôi xem một ví dụ liên quan đến cả hai phương pháp sẽ làm cho mọi thứ rõ ràng hơn rất nhiều đối với chúng tôi
class A[object]: def __new__[cls]: print["New method"] return super[A, cls].__new__[cls] def __init__[self]: print["Init method "] A[]
đầu ra
New method
Init method
Ở trên chúng ta có thể thấy một ví dụ đơn giản liên quan đến cả hai phương pháp. Từ điều này, chúng ta có thể quan sát một điều khác đó là cái mới được gọi tự động. Trong khi đối với init, nó sẽ được gọi mọi lúc trong trường hợp đó
Python __new__ với các đối số
Từ con trăn 2. 6, các nhà phát triển đã bỏ qua các đối số bổ sung từ đối tượng. phương thức __new__. Điều này áp dụng cho tất cả các phiên bản python >2. 6. Hơn nữa, từ python 3. 2, nó báo lỗi bằng cách truyền đối số trong python __new__
Xem thêm
- khởi tạo Python. __init__ trong Python có phải là Trình xây dựng không?
- Các cách để đạt được nhiều hàm tạo trong Python
- Phân vùng đối số NumPy[]. Giải thích với các ví dụ
- Đạp xe xung quanh với Phông chữ Matplotlib
- Các lớp lồng nhau trong Python được giải thích bằng các ví dụ
Phần kết luận
Trong bài viết này, chúng tôi đã đề cập đến Python __new__. Chúng tôi đã đề cập đến một phương thức Magical, được gọi tự động bất cứ khi nào lớp được khởi tạo. Chúng tôi cũng đề cập đến định nghĩa và cú pháp của nó. Để hiểu đúng vấn đề, chúng tôi đã xem xét một vài ví dụ. Cuối cùng, chúng tôi cũng so sánh nó với một chức năng khác có tên là init
Tôi hy vọng bài viết này có thể xóa tan mọi nghi ngờ. Nhưng trong trường hợp bạn có bất kỳ câu hỏi nào chưa được giải quyết, vui lòng viết chúng bên dưới trong phần bình luận. Đọc xong cái này, tại sao không đọc về allclose tiếp theo