2012-09-25 54 views
5

Tôi mới dùng python và cố gắng lấy danh sách các lớp mà lớp của đối tượng kế thừa từ đó. Tôi đang cố gắng để làm điều này bằng cách sử dụng các thuộc tính bases nhưng tôi không có bất kỳ thành công. Ai đó có thể giúp tôi không?Thừa kế lớp trong Python

def foo(C): 
    print(list(C.__bases__)) 

class Thing(object): 
    def f(self): 
     print("Yo") 

class Shape(Thing): 
    def l(self): 
     print("ain't no thang") 

class Circle(Shape): 
    def n(self): 
     print("ain't no shape") 

test = Circle() 
foo(test) 

Trả lời

6

Chỉ các lớp học có __bases__; các cá thể lớp không. Bạn có thể lấy đối tượng lớp thông qua một ví dụ __class__: sử dụng foo(test.__class__) hoặc foo(Circle).

+0

Thank you very much –

4

Sử dụng inspect, từ documentation

Return một tuple của lớp cơ sở cls lớp, trong đó có cls, trong phương pháp để giải quyết. 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. Lưu ý rằng thứ tự phân giải phương pháp phụ thuộc vào loại của cls. Trừ khi rất loại siêu dữ liệu do người dùng xác định cụ thể đang được sử dụng, các cl sẽ là phần tử đầu tiên của bộ dữ liệu.

>>> import inspect 
>>> inspect.getmro(test.__class__) 
(<class '__main__.Circle'>, <class '__main__.Shape'>, <class '__main__.Thing'>, <type 'object'>) 
>>> 

này đi qua lên hệ thống phân cấp thừa kế & in tất cả các lớp học, trong đó có object. Pretty Cool eh?

+0

1 vì nó trả về một danh sách tất cả các lớp học. Để làm cho nó hoạt động với ví dụ của OP, tôi tin rằng nó phải là 'test .__ class__' vì' test' là một ví dụ trong trường hợp của anh ta? – RocketDonkey

+0

yes nó phải là 'test .__ class__', đã vội vàng trả lời :) –

+0

Tôi biết cảm giác :) – RocketDonkey

1

Việc triển khai foo của bạn hoạt động. Nhưng bạn cần phải vượt qua một lớp học để foo, không phải là một trường hợp.

In [1]: def foo(C): 
    ...:   print(list(C.__bases__)) 
    ...: 

In [2]: class Thing(object): 
    ...:   def f(self): 
    ...:     print("Yo") 
    ...: 

In [3]: class Shape(Thing): 
    ...:   def l(self): 
    ...:     print("ain't no thang") 
    ...: 

In [4]: class Circle(Shape): 
    ...:   def n(self): 
    ...:     print("ain't no shape") 
    ...: 

In [5]: test = Circle() 

In [6]: foo(test) 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-6-7b85deb1beaa> in <module>() 
----> 1 foo(test) 

<ipython-input-1-acd1789d43a9> in foo(C) 
     1 def foo(C): 
----> 2   print(list(C.__bases__)) 
     3 

AttributeError: 'Circle' object has no attribute '__bases__' 

In [7]: foo(Thing) 
[<type 'object'>] 

In [8]: foo(Circle) 
[<class '__main__.Shape'>] 

In [9]: foo(Shape) 
[<class '__main__.Thing'>] 
+0

Ah cảm ơn tất cả các bạn. Nhiều đánh giá cao. Tôi không hiểu rằng những đồ vật không có căn cứ –

2
print '\n'.join(base.__name__ for base in test.__class__.__bases__) 

Hoặc, sử dụng các mô-đun inspect:

from inspect import getmro 
print '\n'.join(base.__name__ for base in getmro(test)) 
Các vấn đề liên quan