Python 3 __new__

Trong Python, phương thức

>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
8 tương tự như phương thức
>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
9, nhưng nếu cả hai đều tồn tại thì phương thức
>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
8 sẽ thực thi trước. Trong đối tượng lớp cơ sở,
>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
8 được định nghĩa là một phương thức tĩnh và cần truyền tham số
>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
0. Tham số
>>> class Employee[object]:
..   
..     def __init__[self, name, salary]:
..         self.name = name
..         self.salary = salary
..      
..     def __new__[cls, name, salary]:
..         if 0 < salary < 10000:
..             return object.__new__[cls]
..         else:
..             return None
..   
..     def __str__[self]:
..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
0 đại diện cho lớp cần được khởi tạo và tham số này được trình phân tích cú pháp python cung cấp tự động tại thời điểm khởi tạo

1. Tổng quan về Phương thức __init__ của Python & Tổng quan về Phương thức __new__

  1. Trong Python, phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    2 chịu trách nhiệm khởi tạo thể hiện của lớp
  2. Và trước khi
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    2 được gọi, phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    4 sẽ quyết định có sử dụng phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    2 hay không, bởi vì phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    4 có thể gọi các hàm tạo của lớp khác hoặc đơn giản là trả về các đối tượng khác làm thể hiện của lớp này
  3. Vì vậy, phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 có các ký tự bên dưới
  4. Phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 được gọi khi lớp sẵn sàng tự khởi tạo
  5. Phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 luôn là một phương thức tĩnh của lớp, ngay cả khi không có trình trang trí phương thức tĩnh nào được thêm vào

2. Ví dụ về cách sử dụng phương thức __new__

  1. Mở một thiết bị đầu cuối và chạy lệnh $ python3 để chuyển đến bảng điều khiển môi trường tương tác python.
    :~$ python3
    Python 3.7.1 [default, Dec 14 2018, 19:28:38] 
    [GCC 7.3.0] :: Anaconda, Inc. on linux
    Type "help", "copyright", "credits" or "license" for more information.
    
  2. Đầu tiên, định nghĩa một lớp Nhân viên, nó có hai biến thể hiện tên và lương.
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
  3. Bây giờ hãy tạo hai phiên bản Nhân viên và in ra giá trị biểu diễn chuỗi của chúng.
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    1

3. Python 3 và python 2 sử dụng _new_ khác nhau

3. 1 Sử dụng phương thức __new__ trong python 2

  1. Xin lưu ý rằng phương pháp
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 chỉ được hỗ trợ trong phiên bản python 2. 7 hoặc cao hơn.
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    2

3. 2 Sử dụng phương thức __new__ trong python 3

  1. Ví dụ dưới đây cho thấy cách sử dụng phương thức __new__ trong python 3.
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    3

4. Trả lời câu hỏi

4. 1 Tại sao phương thức __new__[] chạy trước và phương thức __init__[] chạy sau khi tạo đối tượng python?

  1. Tôi tạo một lớp python có cả phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    9 và phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8. Mỗi lần tạo một thể hiện của lớp, tôi thấy phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 luôn chạy trước và phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    9 chạy sau, bạn có thể cho tôi biết tại sao không? .
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    4
  2. Lý do phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 luôn chạy trước phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    9 là vì phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 là phương thức tĩnh cấp lớp. Khi bạn tạo một thể hiện của lớp bằng cách gọi hàm tạo của lớp, phương thức tĩnh lớp
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 sẽ được gọi trước để tạo thể hiện của lớp, sau đó thể hiện sẽ gọi phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    9 cấp thể hiện để khởi tạo thể hiện của lớp python. Từ định nghĩa lớp của bạn, bạn có thể thấy rằng tham số phương thức
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    8 là
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    0 và tham số mehtod của
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    9 là
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    23, tham số
    >>> class Employee[object]:
    ..   
    ..     def __init__[self, name, salary]:
    ..         self.name = name
    ..         self.salary = salary
    ..      
    ..     def __new__[cls, name, salary]:
    ..         if 0 < salary < 10000:
    ..             return object.__new__[cls]
    ..         else:
    ..             return None
    ..   
    ..     def __str__[self]:
    ..         return '{0}[{1}]'.format[self.__class__.__name__, self.__dict__]
    
    23 chỉ tồn tại sau khi thể hiện đã được tạo

__ mới __ trong Python là gì?

Python __new__[] là phương thức khởi tạo kiểm soát việc tạo phiên bản mới . Nó được gọi đầu tiên và nó trả về một thể hiện của lớp mới. Python __init__[] là phương thức khởi tạo để thiết lập các thuộc tính [i. e. , trạng thái] của phiên bản mới được tạo. Nó được gọi sau khi tạo và không trả về gì cả, tôi. e. , Không có.

Tại sao nên sử dụng __ mới __ trong Python?

Theo tài liệu chính thức của Python, __new__ được sử dụng khi bạn cần kiểm soát việc tạo phiên bản mới trong khi __init__ được sử dụng để kiểm soát .

Sự khác biệt giữa __ khởi tạo __ và __ mới __ là gì?

__new__ trả về một thể hiện của lớp. __init__ nhận các thể hiện của lớp được trả về bởi __new__ . Sử dụng __init__ để khởi tạo giá trị.

Làm thế nào để __ thêm __ hoạt động với Python?

__add__ được dùng để thêm các thuộc tính của thể hiện lớp . Ví dụ: giả sử object1 là một thể hiện của lớp A và object2 là một thể hiện của lớp B và cả hai lớp này đều có một thuộc tính gọi là 'a', chứa một số nguyên.

Chủ Đề