Python'da, X modülünü ve Y sınıfını verdiğinizde, X modülünde var olan Y alt sınıflarının bir listesini nasıl oluşturabilirim veya oluşturabilirim?Verilen bir modülde belirli bir sınıfa ait alt sınıflar üzerinde yineleyin
cevap
İşte bunu yapmak için tek yolu şudur:
import inspect
def get_subclasses(mod, cls):
"""Yield the classes in module ``mod`` that inherit from ``cls``"""
for name, obj in inspect.getmembers(mod):
if hasattr(obj, "__bases__") and cls in obj.__bases__:
yield obj
Chris Atlee ve zacherates gelen cevapların ne gereklerini yerine getirmek olduğunu önerebilir
class foo(object): pass
class bar(foo): pass
class baz(foo): pass
class grar(Exception): pass
def find_subclasses(module, clazz):
for name in dir(module):
o = getattr(module, name)
try:
if issubclass(o, clazz):
yield name, o
except TypeError: pass
>>> import foo
>>> list(foo.find_subclasses(foo, foo.foo))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>)]
>>> list(foo.find_subclasses(foo, object))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>), ('grar', <class 'foo.grar'>)]
>>> list(foo.find_subclasses(foo, Exception))
[('grar', <class 'foo.grar'>)]
foo.py modül Verilen? Ben zacerates cevap bu değişiklik olduğunu düşünüyorum daha iyi:
def find_subclasses(module, clazz):
for name in dir(module):
o = getattr(module, name)
try:
if (o != clazz) and issubclass(o, clazz):
yield name, o
except TypeError: pass
Bana verilen cevaplar katılmıyorum nedeni ilk verilen sınıfın uzak bir alt sınıfıdır sınıfları üretmez ve ikinci verilmiş içerir olmasıdır sınıf.
Quamrana'nın önerisi iyi çalışıyor olsa da, daha fazla pythonic yapmayı önermek istiyorum birkaç olası iyileştirmeler var. Standart kütüphaneden inceleme modülünü kullanmaya güveniyorlar.
- Sen
inspect.getmembers()
- deneme/yakalama kullanarak getattr çağrıyı önleyebilirsiniz olanlar ile
inspect.isclass()
kullanılarak önlenebilir, sen eğer tek bir liste anlama Tüm olayı azaltabilir benzeri:
def find_subclasses(module, clazz):
return [
cls
for name, cls in inspect.getmembers(module)
if inspect.isclass(cls) and issubclass(cls, clazz)
]
Harika çalışıyor, ama yanıtım ayrıca temel sınıf (clazz ile gönderdiğim), herhangi bir fikir döndürür? – fredrik
Fredrik, issubclass (Foo, Foo) isminin tersi. Kolay düzeltme olsa da. – runeh
-1 listesine "ekle" ve "clz değil" ifadesini ekleyin: kod çalışmıyor. dürüst olmak gerekirse: 'isim için cls, inspect.getmembers içinde cls (modül)' – tback
- 1. Ek açıklama hedefini belirli bir sınıfa ait alt sınıflar olarak sınırlandırabilir misiniz?
- 2. Belirli bir türdeki tüm alt görünümler üzerinde yineleyin
- 3. Belirli bir sınıfa ait girdi öğelerinin girişini algıla.
- 4. JQuery kullanarak belirli bir sınıfa ait ids listesini nasıl alabilirim?
- 5. JSTL nesnelerin listesi üzerinde yineleyin
- 6. Verilen başka bir alt alana
- 7. Belirli bir sınıfa belirli bir dizeyle başlayan öğeler nasıl alınır?
- 8. Yalnızca halka üzerinde yineleyin Açık Ruby sabitleri
- 9. Smalltalk: Bir yöntemin bir sınıfa mı (yoksa miras hiyerarşisine) ait olup olmadığının kontrol edilmesi
- 10. PostgreSQL - Sorgu sonuçları üzerinde yineleyin
- 11. Statik bir sınıfa ait sayfanın geçerli örneğine eriş
- 12. Bir alt sınıfa ait olmadığında doxygen, temel sınıftaki dokümanları kullanır mı?
- 13. Css seçicileri kullanarak belirli bir sınıfa ait tüm sonraki kardeşleri nasıl bulurum?
- 14. Belirli bir gruba ait kişilerin listesini alın
- 15. Kotlin: Nesnenin bileşenleri üzerinde yineleyin
- 16. Tüm Mongo veritabanı üzerinde yineleyin
- 17. Automapper: Aşağıdaki sınıflar Verilen automapped nesne
- 18. Sınıflar ve alt sınıflar için yazdırma
- 19. Bir Oluşturucu Bir Alt Sınıfa Geri Dönebilir mi?
- 20. Çoklu haritada, belirli bir değere ait anahtar nasıl alınır?
- 21. Bir alt sınıfa bir yönteme geçmek ancak parametre olarak süper sınıfa sahip olmak?
- 22. Belirli bir sınıfa ilk öğe için css kuralı nasıl atanır?
- 23. Belirli bir sayıya verilen bir sayı dizisi oluşturma
- 24. Java IDE - Bir işlev veya sınıfa ait INDIRECT kullanımları/referansları buluyor musunuz?
- 25. Verilen alt dizinleri atlarken bir dizini docker görüntüsüne kopyalama
- 26. Hangi sınıflar alt sınıflara eklenemez?
- 27. vaka sınıfı veri üyeleri üzerinde yineleyin
- 28. C# Belirli Sınıflar için ÖznitelikSayı
- 29. Rspec: Başka bir sınıfa ait bir yöntem çağrısının çağrılıp çağrılmadığını nasıl kontrol edebilirim?
- 30. Bir sınıfa ait özelliği jquery ile değiştirmenin bir yolu var mı?
Benim çözümüm, 'cls' doğrudan torunları olmayan sınıfları döndürmeyecek. Aşağıdaki quamrana'nın çözümü, atalarının içinde bir yeri olan herhangi bir sınıfı bulacaktır. –