Xác định tên cho xây dựng trong các loại mà không phải là trực tiếp có thể truy cập một builtin."""nhập khẩu sys# Vòng lặp trong Python không phải là một vấn đề của kiểu nhưng giao thức. Một lượng lớn# và thay đổi số lượng builtin loại thực hiện * một * hương vị của# iterator. Không kiểm tra các loại! Sử dụng hasattr để kiểm tra cho cả hai# "__iter__" và "__next__" thuộc tính để thay thế.def _f(): vượt quaFunctionType = type(_f)LambdaType = type(lambda: None) # tương tự như FunctionTypeCodeType = type(_f.__code__)MappingProxyType = type(type.__dict__)SimpleNamespace = type(sys.implementation)def _g(): sản lượng 1GeneratorType = type(_g())lớp _C: def _m(self): vượt quaMethodType = type(_C()._m)BuiltinFunctionType = type(len)BuiltinMethodType = type([].append) # tương tự như BuiltinFunctionTypeModuleType = type(sys)Hãy thử: nâng cao TypeErrorNgoại trừ TypeError: TB = sys.exc_info() [2] TracebackType = type(tb) FrameType = type(tb.tb_frame) TB = không có gì; del tb# Cho Jython, hai loại sau là giống hệt nhauGetSetDescriptorType = type(FunctionType.__code__)MemberDescriptorType = type(FunctionType.__globals__)del sys, _f, _g, _C, # không cho xuất khẩu# Cung cấp một cơ chế phù hợp PEP 3115 cho lớp học sáng tạodef new_class (tên, bases=(), kwds = không có gì, exec_body = không có gì): "" "Tạo ra một lớp đối tượng tự động bằng cách sử dụng các metaclass thích hợp." "" Meta, ns, kwds = prepare_class (tên, căn cứ, kwds) Nếu exec_body không phải là không có: exec_body(NS) trở về meta (tên, căn cứ, ns, ** kwds)def prepare_class (tên, bases=(), kwds = không có gì): "" "Gọi phương thức __prepare__ của metaclass thích hợp. Trở về (metaclass, không gian tên, kwds) như là 3 tuple metaclass * là thích hợp metaclass không gian tên * là không gian tên lớp học chuẩn bị kwds * là một bản Cập Nhật của việc thông qua trong kwds đối với bất kỳ 'metaclass' mục gỡ bỏ. Nếu không có đối số kwds được thông qua vào, điều này sẽ là một sản phẩm nào dict. """ Nếu không phải là kwds: kwds = {} khác: kwds = dict(kwds) # không làm thay đổi bản đồ được cung cấp Nếu 'metaclass' trong kwds: Meta = kwds.pop('metaclass') khác: Nếu căn cứ: Meta = type(bases[0]) khác: Meta = loại Nếu isinstance (meta, loại): # Khi meta là một loại, chúng tôi lần đầu tiên xác định hầu hết nguồn gốc metaclass # thay vì gọi các ứng cử viên ban đầu trực tiếp Meta = _calculate_meta (meta, căn cứ) Nếu hasattr (meta, '__prepare__'): NS = meta.__prepare__ (tên, căn cứ, ** kwds) khác: NS = {} trở về meta, ns, kwdsdef _calculate_meta (meta, cơ sở): "" "Tính toán nhất có nguồn gốc metaclass." "" người chiến thắng = meta Đối với cơ sở ở cơ sở: base_meta = type(base) Nếu issubclass (người chiến thắng, base_meta): tiếp tục Nếu issubclass (base_meta, người chiến thắng): người chiến thắng = base_meta tiếp tục # khác: nâng cao TypeError ("xung đột metaclass:" "các metaclass của một lớp học có nguồn gốc" "phải có một phân lớp (không nghiêm ngặt)" "của các metaclasses tất cả các căn cứ của nó") trở lại chiến thắnglớp học DynamicClassAttribute: "" "Tuyến đường thuộc tính truy cập vào một lớp học để __getattr__. Đây là một mô tả, được sử dụng để xác định các thuộc tính hành động một cách khác nhau khi truy cập thông qua một thể hiện và thông qua một lớp học. Ví dụ truy cập vẫn còn bình thường, nhưng truy cập vào một thuộc tính thông qua một lớp học sẽ được chuyển đến các Các phương pháp __getattr__ của lớp; Điều này được thực hiện bằng cách tăng AttributeError. Điều này cho phép một để có tài sản hoạt động trên một trường hợp, và có ảo Các thuộc tính trên lớp có cùng tên (xem Enum ví dụ). """ def __init__ (tự, fget = không có gì, fset = không có gì, fdel = không có gì, doc = không có gì): self.fget = fget self.fset = fset self.fdel = fdel # tiếp theo hai đường làm cho DynamicClassAttribute hành động giống như bất động sản self.__doc__ = doc hoặc fget.__doc__ self.overwrite_doc = doc là không có # hỗ trợ cho phương pháp trừu tượng self.__isabstractmethod__ = bool (getattr (fget, '__isabstractmethod__', False)) def __get__ (tự, ví dụ, ownerclass = không có gì): Nếu không phải là trường hợp: Nếu self.__isabstractmethod__: trở lại tự nâng cao AttributeError() Elif self.fget là không có: nâng cao AttributeError ("thuộc tính không thể đọc được") trở lại self.fget(instance) def __set__ (tự, ví dụ, giá trị): Nếu không phải là self.fset: nâng cao AttributeError ("không thể đặt thuộc tính") self.fset (ví dụ, giá trị) def __delete__ (tự, ví dụ): Nếu không phải là self.fdel: nâng cao AttributeError ("không thể xóa thuộc tính") self.fdel(instance) def getter (tự, fget): fdoc = fget.__doc__ nếu self.overwrite_doc
đang được dịch, vui lòng đợi..
