Đưa ra một lớp Foo
(cho dù đó là một lớp kiểu mới hay không), làm thế nào để bạn tạo ra tất cả các lớp cơ sở - bất cứ nơi nào trong hệ thống phân cấp thừa kế - nó issubclass
là gì?
Đưa ra một lớp Foo
(cho dù đó là một lớp kiểu mới hay không), làm thế nào để bạn tạo ra tất cả các lớp cơ sở - bất cứ nơi nào trong hệ thống phân cấp thừa kế - nó issubclass
là gì?
Câu trả lời:
inspect.getmro(cls)
hoạt động cho cả các lớp kiểu mới và kiểu cũ và trả về giống như NewClass.mro()
: một danh sách lớp và tất cả các lớp tổ tiên của nó, theo thứ tự được sử dụng để phân giải phương thức.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
inspect.getmro(obj)
thay vì inspect.getmro(type(obj))
.
Xem thuộc __bases__
tính có sẵn trên một con trăn class
, trong đó có một bộ các lớp cơ sở:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
getmro
nói rõ ràng "Không có lớp nào xuất hiện nhiều hơn một lần trong bộ dữ liệu này"?
__bases__
chỉ đi lên một cấp . (Như tiện ích đệ quy của bạn ngụ ý, nhưng một cái nhìn lướt qua ví dụ có thể không nhận ra điều đó.)
inspect.getclasstree()
sẽ tạo ra một danh sách các lớp và các căn cứ của chúng. Sử dụng:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
bạn có thể sử dụng __bases__
bộ dữ liệu của đối tượng lớp:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
Các tuple trả về __bases__
có tất cả các lớp cơ sở của nó.
Hy vọng nó giúp!
__bases__
Theo tài liệu Python , chúng ta cũng có thể chỉ cần sử dụng class.__mro__
thuộc tính hoặc class.mro()
phương thức:
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True
Mặc dù câu trả lời của Jochen rất hữu ích và chính xác, vì bạn có thể có được hệ thống phân cấp lớp bằng cách sử dụng phương thức .getmro () của mô-đun kiểm tra, điều quan trọng là làm nổi bật hệ thống phân cấp thừa kế của Python như sau:
Ví dụ:
class MyClass(YourClass):
Một lớp kế thừa
Ví dụ:
class YourClass(Object):
Một lớp kế thừa
Một lớp có thể kế thừa từ lớp khác - Lớp được gán là được kế thừa - đặc biệt, các phương thức của nó được kế thừa - điều này có nghĩa là các thể hiện của lớp (con) kế thừa có thể truy cập được quy cho lớp (cha) được kế thừa
dụ -> lớp -> sau đó các lớp kế thừa
sử dụng
import inspect
inspect.getmro(MyClass)
sẽ cho bạn thấy hệ thống phân cấp, trong Python.