Bir Python sınıfının üst sınıfını nasıl alabilirim?
Bir Python sınıfının üst sınıfını nasıl alabilirim?
Yanıtlar:
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'>)
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 ;-).
cls.__mro__
(en azından Python
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.
object
yanıt vermiyor gibi görünüyor mro
.
x
biz çağrısıyla yöntem çözünürlüğü sipariş alabilirsiniz type(x).mro()
eğer biz düşünebiliriz x
vardır ClassX
: bir temel sınıf olarak ClassX in type(x).mro()
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 inspect
gereksiz 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!
inspect.getmro
sadece aramaları __mro__
sen de görebileceğiniz gibi, nesne üzerinde github.com/python/cpython/blob/... . Kullanmak getmro
daha temiz ve daha okunabilir kod üretir. Bir işlev çağrısını atlamak aslında daha hızlıdır.
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)
type(C()).__bases__