Python sınıfının ebeveynlerini nasıl edinebilirim?


202

Bir Python sınıfının üst sınıfını nasıl alabilirim?

Yanıtlar:


235

Aşağıdaki özelliği kullanın:

cls.__bases__

Gönderen docs :

Bir sınıf nesnesinin temel sınıflarının bir parçası.

Misal:

>>> str.__bases__
(<type 'basestring'>,)

Başka bir örnek:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)

2
type(C()).__bases__
Örneklendirilmiş

107

Sadece atalardan ziyade tüm ataları istiyorsanız , inspect.getmro kullanın :

import inspect
print inspect.getmro(cls)

Yararlı bir şekilde, bu size tüm yöntem sınıflarını "yöntem çözümleme sırası" nda verir - yani bir yöntemi (ya da aslında herhangi bir başka öznitelik - yöntem ve diğer öznitelikleri) çözerken ataların denetleneceği sıra Python'da, sonuçta ;-).


34
Ayrıca sadece kullanabilirsiniz cls.__mro__(en azından Python
3.5'te

@ naught101, plz tam cevaba dönüştürün. Neredeyse özledim ve sanırım, birçok insan da.
Shihab Shahriar Khan

14

Yeni stil sınıfları, çağırabileceğiniz bir mro yöntemine sahiptir ve bu yöntem, yöntem çözünürlüğü sırasında üst sınıfların bir listesini döndürür.


Yeni stil sınıfı nedir? Bunu Django modelleriyle kullanabileceğim gibi görünüyor, ancak basitçe miras kalan her şey objectyanıt vermiyor gibi görünüyor mro.
Brian Kung

1
Bir nesneyi dikkate xbiz çağrısıyla yöntem çözünürlüğü sipariş alabilirsiniz type(x).mro() eğer biz düşünebiliriz xvardır ClassX: bir temel sınıf olarak ClassX in type(x).mro()
648trindade

14

Tüm ebeveynleri görmenin en hızlı yolu ve SİPARİŞTE , sadece yerleşik__mro__

yani repr(YOUR_CLASS.__mro__)


>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__

çıkışları, IN SİPARİŞ


(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>, 
<type 'exceptions.BaseException'>, <type 'object'>)
>>>

İşte aldın. Şu anda "en iyi" cevabı, 182 oya sahip (bu yazarak kulüpler gibi) ama bu içine bakarak, döngü dolambaçlı bazılarından daha SO çok daha kolaydır üsleri sınıf İKİ veya daha fazla ebeveyn uzandığında bahsetmiyorum, her seferinde bir sınıf sınıflar. İçeriği inspectgereksiz yere içe aktarma ve kullanma . Dürüst olmak gerekirse, insanların sadece yerleşikleri kullanmayı bilmedikleri bir utanç

Umarım bu yardımcı olur!


John Smith stackoverflow.com/users/139885/john-smith , umarım bu yanıtı görürsünüz. Beğendiyseniz, lütfen bana bir oy verin!
PyTis

1
Aslında, inspect.getmrosadece aramaları __mro__sen de görebileceğiniz gibi, nesne üzerinde github.com/python/cpython/blob/... . Kullanmak getmrodaha temiz ve daha okunabilir kod üretir. Bir işlev çağrısını atlamak aslında daha hızlıdır.
tna0y

9

Sadece ebeveynleri almak istiyorsanız üsleri kullanın __mro__, yöntem çözünürlük sırasını almak için (@ naught101 tarafından işaret edildiği gibi) kullanın (böylece initin hangi sırada yürütüldüğünü bilmek için).

Temeller (ve önce var olan bir nesne için sınıfı edinme):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)

Son Python sürümlerinde mro için:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)

Açıkçası, zaten bir sınıf tanımınız olduğunda, bunu __mro__doğrudan arayabilirsiniz :

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)

3

Hepsinin çağrıldığından emin olmak istiyorsanız super, tüm düzeylerde kullanın .


Süper kullandıktan sonra yine de tüm seviyelerde kullanmak zorundasınız, bu yüzden açıkça kullanıldığını belgelemelisiniz. Ayrıca süper her sınıfta çalışmadığını bilmek isteyebilirsiniz ...
DasIch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.