Có hai khái niệm đó có thể là hữu ích cần lưu ý:
- mọi thứ trong python là một đối tượng, bao gồm các lớp học và metaclasses
- metaclasses là các nhà thầu của các lớp học, chứ không phải tổ tiên của họ, vì vậy họ không xuất hiện trong
__bases__
.
Điều đó có nghĩa là object
thực sự có type
làm metaclass.
Cũng giống như một sự tò mò, phần "nghịch lý" của câu chuyện là type
, mà là một metaclass cũng là một đối tượng, nhưng không thể có chính nó như metaclass (nó sẽ là một chút của gà và trứng vấn đề, nếu bạn nghĩ về nó).
Nghịch lý được giải quyết với một số voodoo C trong mã nguồn python, nhưng tôi không biết nhiều về nó!
EDIT: (một số mã ví dụ)
>>> class MyMeta(type):
... def __new__(cls, name, bases, dct):
... return type.__new__(cls, name, bases, dct)
...
>>> class MyClass(object):
... __metaclass__ = MyMeta
...
Bây giờ quan sát rằng obj
kế thừa từ object
>>> obj = MyClass()
>>> MyClass.__bases__
(<type 'object'>,)
Đối với câu hỏi của bạn trong các ý kiến về dir(obj)
không sản lượng __metaclass__
thuộc tính : lý do là __metaclass__
là thuộc tính của lớp không phải đối tượng được khởi tạo của nó. Lưu ý trong thực tế là: (! Với một câu trả lời rất toàn diện, tất nhiên)
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> MyClass.__metaclass__
<class '__main__.MyMeta'>
Nếu bạn quan tâm đến đào sâu hiểu biết của bạn metaclasses, đây là một cổ điển SO câu hỏi:
What is a metaclass in Python?
HTH!
sử dụng metaclass mặc định? Bạn có nghĩa là, nếu tôi xác định một lớp (không kế thừa 'đối tượng') mà không chỉ định metaclass của nó, thì lớp này sẽ được hiểu bởi' type'? – Alcott
Vâng, vâng, tôi nghĩ vậy. – Alcott
Có. 'type' là metaclass Python sử dụng nếu bạn không chỉ định metaclass. – kindall