Επαναλάβει πάνω υποκατηγορίες μιας συγκεκριμένης τάξης σε μια συγκεκριμένη μονάδα

ψήφοι
15

Στην Python, δίνεται μια μονάδα X και μια τάξη Υ, πώς μπορώ να επαναλάβει ή να δημιουργήσετε μια λίστα με όλες τις υποκατηγορίες του Υ που υπάρχουν στη μονάδα Χ;

Δημοσιεύθηκε 04/09/2008 στις 17:05
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
11

Εδώ είναι ένας τρόπος για να το κάνουμε:

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
Απαντήθηκε 04/09/2008 στις 17:20
πηγή χρήστη

ψήφοι
1

Με δεδομένη την ενότητα foo.py

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'>)]
Απαντήθηκε 04/09/2008 στις 17:29
πηγή χρήστη

ψήφοι
4

Μπορώ να προτείνω ότι καμία από τις απαντήσεις από τον Chris Atlee και zacherates πληρούν τις απαιτήσεις; Νομίζω ότι αυτή η τροποποίηση στην απάντηση zacerates είναι καλύτερη:

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

Ο λόγος που διαφωνώ με τις απαντήσεις που δόθηκαν είναι ότι η πρώτη δεν παράγει τάξεις που είναι μια μακρινή υποκατηγορία της συγκεκριμένης κατηγορίας, και η δεύτερη περιλαμβάνει τη συγκεκριμένη κατηγορία.

Απαντήθηκε 05/09/2008 στις 21:54
πηγή χρήστη

ψήφοι
20

Αν και πρόταση Quamrana δουλεύει μια χαρά, υπάρχουν δύο πιθανές βελτιώσεις που θα ήθελα να προτείνω να γίνει πιο pythonic. Επικαλούνται σχετικά με τη χρήση της μονάδας επιθεωρούν από την πρότυπη βιβλιοθήκη.

  1. Μπορείτε να αποφύγετε την κλήση getattr χρησιμοποιώντας inspect.getmembers()
  2. Η δοκιμή / αλιευμάτων μπορεί να αποφευχθεί με τη χρήση inspect.isclass()

Με εκείνους, μπορείτε να μειώσετε το όλο θέμα σε μια ενιαία λίστα κατανόηση αν θέλετε:

def find_subclasses(module, clazz):
    return [
        cls
            for name, cls in inspect.getmembers(module)
                if inspect.isclass(cls) and issubclass(cls, clazz)
    ]
Απαντήθηκε 03/01/2009 στις 00:56
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more