Tạo tên đối tượng động Python

Nó cũng xác định tên cho một số loại đối tượng được sử dụng bởi trình thông dịch Python tiêu chuẩn, nhưng không được hiển thị dưới dạng nội trang như hoặc là

Cuối cùng, nó cung cấp một số lớp và chức năng tiện ích liên quan đến kiểu bổ sung không đủ cơ bản để trở thành nội trang

Tạo kiểu động

các loại. new_class[tên , cơ sở=[], kwds=None, exec_body=None]

Tạo một đối tượng lớp động bằng cách sử dụng siêu dữ liệu thích hợp

Ba đối số đầu tiên là các thành phần tạo nên tiêu đề định nghĩa lớp. tên lớp, các lớp cơ sở [theo thứ tự], các đối số từ khóa [chẳng hạn như metaclass]

Đối số exec_body là một cuộc gọi lại được sử dụng để điền vào không gian tên lớp mới được tạo. Nó phải chấp nhận không gian tên lớp làm đối số duy nhất của nó và cập nhật không gian tên trực tiếp với nội dung lớp. Nếu không có cuộc gọi lại nào được cung cấp, nó có tác dụng tương tự như chuyển vào lambda ns: None

Mới trong phiên bản 3. 3

các loại. prepare_class[tên , cơ sở=[], kwds=None]

Tính toán siêu dữ liệu thích hợp và tạo không gian tên lớp

Các đối số là các thành phần tạo nên tiêu đề định nghĩa lớp. tên lớp, các lớp cơ sở [theo thứ tự] và các đối số từ khóa [chẳng hạn như metaclass]

Giá trị trả về là 3-tuple. metaclass, namespace, kwds

siêu dữ liệu là siêu dữ liệu thích hợp, không gian tên là không gian tên lớp đã chuẩn bị và kwds là bản sao cập nhật của đối số kwds được truyền với bất kỳ mục nhập 'metaclass' nào bị xóa. Nếu không có đối số kwds nào được truyền vào, đây sẽ là một lệnh trống

Mới trong phiên bản 3. 3

Đã thay đổi trong phiên bản 3. 6. Giá trị mặc định cho phần tử

class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
0 của bộ được trả về đã thay đổi. Giờ đây, ánh xạ bảo toàn thứ tự chèn được sử dụng khi siêu dữ liệu không có phương thức
class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
1.

Xem thêm

Chi tiết đầy đủ về quy trình tạo lớp được hỗ trợ bởi các chức năng này

PEP 3115 - Siêu dữ liệu trong Python 3000

Giới thiệu hook không gian tên

class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
1

các loại. resolve_bases[base]

Giải quyết các mục nhập MRO một cách linh hoạt như được chỉ định bởi PEP 560

Hàm này tìm kiếm các mục trong cơ sở không phải là phiên bản của và trả về một bộ trong đó mỗi đối tượng có phương thức

class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
4 được thay thế bằng kết quả được giải nén khi gọi phương thức này. Nếu một mục cơ sở là một thể hiện của , hoặc nó không có phương thức
class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
4, thì nó được bao gồm trong bộ dữ liệu trả về không thay đổi

Mới trong phiên bản 3. 7

Xem thêm

PEP 560 - Hỗ trợ cốt lõi để nhập mô-đun và các loại chung

Các loại phiên dịch tiêu chuẩn

Mô-đun này cung cấp tên cho nhiều loại được yêu cầu để triển khai trình thông dịch Python. Nó cố tình tránh bao gồm một số loại chỉ phát sinh ngẫu nhiên trong quá trình xử lý, chẳng hạn như loại

class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented
7

Việc sử dụng điển hình của những tên này là để kiểm tra hoặc

Nếu bạn khởi tạo bất kỳ loại nào trong số này, hãy lưu ý rằng chữ ký có thể khác nhau giữa các phiên bản Python

Tên tiêu chuẩn được xác định cho các loại sau

các loại. NoneType

loại

Mới trong phiên bản 3. 10

các loại. Loại chức năngloại. Loại Lambda

Loại hàm do người dùng định nghĩa và hàm được tạo bởi biểu thức

Đưa ra một types2 với lập luận types3

Sự kiện kiểm tra chỉ xảy ra để khởi tạo trực tiếp các đối tượng chức năng và không được đưa ra để biên dịch bình thường

các loại. Loại máy phát điện

Loại đối tượng -iterator, được tạo bởi các hàm tạo

các loại. Loại Coroutine

Loại đối tượng được tạo bởi hàm

Mới trong phiên bản 3. 5

các loại. AsyncGeneratorType

Loại đối tượng -iterator, được tạo bởi các hàm tạo không đồng bộ

Mới trong phiên bản 3. 6

loại loại. Loại mã[**kwargs]

Loại cho các đối tượng mã chẳng hạn như được trả về bởi

Nâng cao một types6 với các đối số types3, types8, types9, int0, int1, int2, int3, int4, int5

Lưu ý rằng các đối số được kiểm tra có thể không khớp với tên hoặc vị trí mà trình khởi tạo yêu cầu. Sự kiện kiểm tra chỉ xảy ra để khởi tạo trực tiếp các đối tượng mã và không được đưa ra để biên dịch bình thường

thay thế[**kwargs]

Trả về một bản sao của đối tượng mã với các giá trị mới cho các trường đã chỉ định

Mới trong phiên bản 3. 8

các loại. Loại ô

Loại cho các đối tượng ô. các đối tượng như vậy được sử dụng làm nơi chứa các biến tự do của hàm

Mới trong phiên bản 3. 8

các loại. Loại phương thức

Loại phương thức của các thể hiện lớp do người dùng định nghĩa

các loại. Loại chức năng tích hợpcác loại. BuiltinMethodType

Loại hàm dựng sẵn như or và phương thức của lớp dựng sẵn. [Ở đây, thuật ngữ “tích hợp sẵn” có nghĩa là “được viết bằng C”. ]

các loại. WrapperDescriptorType

Loại phương thức của một số kiểu dữ liệu và lớp cơ sở tích hợp như hoặc

Mới trong phiên bản 3. 7

các loại. MethodWrapperType

Loại phương thức ràng buộc của một số kiểu dữ liệu và lớp cơ sở dựng sẵn. Ví dụ, đó là loại str0

Mới trong phiên bản 3. 7

các loại. NotImplementedType

loại

Mới trong phiên bản 3. 10

các loại. MethodDescriptorType

Các kiểu phương thức của một số kiểu dữ liệu dựng sẵn như

Mới trong phiên bản 3. 7

các loại. ClassMethodDescriptorType

Loại phương thức lớp không liên kết của một số loại dữ liệu tích hợp, chẳng hạn như str3

Mới trong phiên bản 3. 7

loại loại. Loại mô-đun[tên , doc=None]

loại. Hàm tạo lấy tên của mô-đun sẽ được tạo và tùy chọn tên của mô-đun đó.

Ghi chú

Sử dụng để tạo một mô-đun mới nếu bạn muốn đặt các thuộc tính kiểm soát nhập khác nhau

__doc__

của mô-đun. Mặc định là types0

__bộ nạp__

Cái đã tải mô-đun. Mặc định là types0

Thuộc tính này là để phù hợp như được lưu trữ trong đối tượng

Ghi chú

Phiên bản tương lai của Python có thể ngừng đặt thuộc tính này theo mặc định. Để đề phòng thay đổi có thể xảy ra này, tốt nhất bạn nên đọc từ thuộc tính hoặc sử dụng metaclass0 nếu bạn rõ ràng cần sử dụng thuộc tính này

Đã thay đổi trong phiên bản 3. 4. Mặc định là types0. Trước đây thuộc tính là tùy chọn.

__Tên__

Tên của mô-đun. Dự kiến ​​​​sẽ phù hợp

__bưu kiện__

Mô-đun nào thuộc về. Nếu mô-đun là cấp cao nhất [i. e. không phải là một phần của bất kỳ gói cụ thể nào] thì thuộc tính phải được đặt thành metaclass3, nếu không, thuộc tính phải được đặt thành tên của gói [có thể là nếu chính mô-đun là một gói]. Mặc định là types0

Thuộc tính này là để phù hợp như được lưu trữ trong đối tượng

Ghi chú

Phiên bản tương lai của Python có thể ngừng đặt thuộc tính này theo mặc định. Để đề phòng thay đổi có thể xảy ra này, tốt nhất bạn nên đọc từ thuộc tính hoặc sử dụng metaclass9 nếu bạn rõ ràng cần sử dụng thuộc tính này

Đã thay đổi trong phiên bản 3. 4. Mặc định là types0. Trước đây thuộc tính là tùy chọn.

__spec__

Bản ghi trạng thái liên quan đến hệ thống nhập của mô-đun. Dự kiến ​​​​là một ví dụ của

Mới trong phiên bản 3. 4

các loại. Loại dấu chấm lửng

loại

Mới trong phiên bản 3. 10

loại loại. Bí danh chung[t_origin , t_args]

Loại chẳng hạn như lambda ns: None3

lambda ns: None4 phải là một lớp chung không tham số hóa, chẳng hạn như lambda ns: None5, lambda ns: None6 hoặc lambda ns: None7. lambda ns: None8 phải là một [có thể có độ dài 1] loại tham số hóa lambda ns: None4

>>> from types import GenericAlias

>>> list[int] == GenericAlias[list, [int,]]
True
>>> dict[str, int] == GenericAlias[dict, [str, int]]
True

Mới trong phiên bản 3. 9

Đã thay đổi trong phiên bản 3. 9. 2. Loại này hiện có thể được phân lớp.

loại loại. UnionType

loại

Mới trong phiên bản 3. 10

loại loại. TracebackType[tb_next , tb_frame, tb_lasti, tb_lineno]

Loại đối tượng truy nguyên chẳng hạn như được tìm thấy trong metaclass1

Xem để biết chi tiết về các thuộc tính và hoạt động có sẵn cũng như hướng dẫn tạo truy nguyên động

các loại. Kiểu khung

Loại đối tượng khung chẳng hạn như được tìm thấy trong metaclass2 nếu metaclass3 là đối tượng truy nguyên

Xem để biết chi tiết về các thuộc tính và hoạt động có sẵn

các loại. GetSetDescriptorType

Loại đối tượng được xác định trong các mô-đun mở rộng với metaclass4, chẳng hạn như metaclass5 hoặc metaclass6. Loại này được sử dụng làm mô tả cho các thuộc tính đối tượng;

các loại. MemberDescriptorType

Loại đối tượng được xác định trong các mô-đun mở rộng với metaclass8, chẳng hạn như metaclass9. Loại này được sử dụng làm bộ mô tả cho các thành viên dữ liệu C đơn giản sử dụng các hàm chuyển đổi tiêu chuẩn;

Chi tiết triển khai CPython. Trong các triển khai khác của Python, loại này có thể giống với metaclass, namespace, kwds1

loại loại. MappingProxyType[ánh xạ]

Proxy chỉ đọc của ánh xạ. Nó cung cấp chế độ xem động trên các mục của ánh xạ, có nghĩa là khi ánh xạ thay đổi, chế độ xem sẽ phản ánh những thay đổi này

Mới trong phiên bản 3. 3

Đã thay đổi trong phiên bản 3. 9. Đã cập nhật để hỗ trợ toán tử hợp [metaclass, namespace, kwds2] mới từ PEP 584, đơn giản là ủy quyền cho ánh xạ cơ bản.

khóa trong proxy

Trả về metaclass, namespace, kwds3 nếu ánh xạ bên dưới có khóa chính, ngược lại thì metaclass, namespace, kwds4

ủy nhiệm [key]

Trả lại mục của ánh xạ cơ bản bằng phím key. Tăng một phím if không có trong ánh xạ cơ bản

lặp đi lặp lại [proxy]

Trả về một trình vòng lặp qua các khóa của ánh xạ cơ bản. Đây là lối tắt cho metaclass, namespace, kwds6

len[proxy]

Trả về số mục trong ánh xạ cơ bản

bản sao[]

Trả lại một bản sao nông của ánh xạ bên dưới

lấy[khóa[ , default]]

Trả về giá trị cho khóa nếu khóa nằm trong ánh xạ cơ bản, nếu không thì mặc định. Nếu giá trị mặc định không được đưa ra, nó sẽ mặc định là types0, do đó phương thức này không bao giờ tăng

item[]

Trả lại chế độ xem mới cho các mục của ánh xạ bên dưới [_______11_______9 cặp]

phím[]

Trả lại chế độ xem mới cho các khóa của ánh xạ bên dưới

giá trị[]

Trả lại chế độ xem mới về các giá trị của ánh xạ cơ bản

đảo ngược [ủy quyền]

Trả về một trình vòng lặp đảo ngược trên các khóa của ánh xạ bên dưới

Mới trong phiên bản 3. 9

Các lớp và chức năng tiện ích bổ sung

loại loại. Không gian tên đơn giản

Một lớp con đơn giản cung cấp quyền truy cập thuộc tính vào không gian tên của nó, cũng như một đại diện có ý nghĩa

Không giống như , với 'metaclass'2 bạn có thể thêm và bớt thuộc tính. Nếu một đối tượng 'metaclass'2 được khởi tạo với các đối số từ khóa, chúng sẽ được thêm trực tiếp vào không gian tên bên dưới

Loại gần tương đương với đoạn mã sau

class SimpleNamespace:
    def __init__[self, /, **kwargs]:
        self.__dict__.update[kwargs]

    def __repr__[self]:
        items = [f"{k}={v!r}" for k, v in self.__dict__.items[]]
        return "{}[{}]".format[type[self].__name__, ", ".join[items]]

    def __eq__[self, other]:
        if isinstance[self, SimpleNamespace] and isinstance[other, SimpleNamespace]:
           return self.__dict__ == other.__dict__
        return NotImplemented

'metaclass'2 có thể hữu ích khi thay thế cho 'metaclass'5. Tuy nhiên, đối với loại bản ghi có cấu trúc, hãy sử dụng thay thế

Mới trong phiên bản 3. 3

Đã thay đổi trong phiên bản 3. 9. Thứ tự thuộc tính trong phần lặp lại đã thay đổi từ thứ tự bảng chữ cái sang phần chèn [như lambda ns: None7].

các loại. DynamicClassAttribute[fget=Không có, fset=None, fdel=None, doc=None]

Định tuyến truy cập thuộc tính trên một lớp tới __getattr__

Đây là một bộ mô tả, được sử dụng để xác định các thuộc tính hoạt động khác nhau khi được truy cập thông qua một thể hiện và thông qua một lớp. Quyền truy cập phiên bản vẫn bình thường, nhưng quyền truy cập vào một thuộc tính thông qua một lớp sẽ được định tuyến đến phương thức __getattr__ của lớp đó;

Điều này cho phép một người có các thuộc tính hoạt động trên một cá thể và có các thuộc tính ảo trên lớp có cùng tên [xem ví dụ]

Mới trong phiên bản 3. 4

Chức năng tiện ích Coroutine

các loại. coroutine[gen_func]

Hàm này chuyển đổi một hàm thành một hàm trả về một coroutine dựa trên trình tạo. Coroutine dựa trên trình tạo vẫn là một , nhưng cũng được coi là một đối tượng và là. Tuy nhiên, nó có thể không nhất thiết phải triển khai phương thức 'metaclass'9

Nếu gen_func là hàm tạo, nó sẽ được sửa đổi tại chỗ

Nếu gen_func không phải là hàm tạo, nó sẽ được bao bọc. Nếu nó trả về một thể hiện của , thì thể hiện đó sẽ được bao bọc trong một đối tượng proxy có thể chờ được. Tất cả các loại đối tượng khác sẽ được trả về nguyên trạng

Chủ Đề