2012-09-25 19 views
5

Python'a yeni ve bir nesnenin sınıfının miras sınıflarının bir listesini almaya çalışıyorum. Bunu bases özniteliğini kullanarak yapmaya çalışıyorum, ancak hiç bir başarım yok. Birisi bana yardım edebilir mi?Python'da Sınıf Devralma

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) 

cevap

6

Sadece sınıfları __bases__ var; sınıf örnekleri yok. Sınıf nesnesini bir örneğin __class__ aracılığıyla alabilirsiniz: foo(test.__class__) veya foo(Circle) kullanın.

+0

Çok teşekkür ederim –

4
Kullanım inspect

, documentation

Return yöntemi çözünürlük sırayla cls'ye dahil sınıf CLS temel sınıflar, bir kayıt düzeni dan. Bu derste hiçbir sınıf bir kereden fazla görülmez. Not , yöntem çözüm sırasının, cls türüne bağlı olduğunu unutmayın. Çok tuhaf kullanıcı tanımlı metatype kullanılmadığı sürece, cl'ler, tuple'ın ilk öğesi olacaktır.

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

Bu miras hiyerarşiyiye object dahil & baskılar tüm sınıfları, yukarı erişir. Oldukça güzel eh?

+0

1 o sınıfların bir listesini döndürür beri. OP'in örneğiyle çalışmasını sağlamak için 'test' kendi durumunda bir örnek olduğu için 'test .__ class__' olması gerektiğine inanıyorum? – RocketDonkey

+0

evet 'test .__ class__' olmalı, cevap vermek için acele ediyordu :) –

+0

Duyguyu biliyorum :) – RocketDonkey

1

Uygulamanız foo çalışır. Ancak, bir örneği değil, bir sınıfa foo geçmek zorundasınız. inspect modülü kullanarak

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 Hepinize teşekkür ederim. Çok takdir edildi. Nesnelerin üsleri olmadığını anlamıştım –

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

Veya:

from inspect import getmro 
print '\n'.join(base.__name__ for base in getmro(test))