Home >Backend Development >Python Tutorial >How Can I Find All Subclasses of a Python Class?

How Can I Find All Subclasses of a Python Class?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-17 09:50:03223browse

How Can I Find All Subclasses of a Python Class?

Accessing Subclasses of a Class

In Python, finding all subclasses of a given class can be achieved through the __subclasses__ method. This method is available for new-style classes (those inheriting from object in Python 3 or subclassed from a new-style class).

For example, consider the following code:

class Foo(object): pass
class Bar(Foo): pass
class Baz(Foo): pass
class Bing(Bar): pass

To retrieve the subclasses of Foo, we can use the following code:

print([cls.__name__ for cls in Foo.__subclasses__()])

This will print the names of the subclasses:

['Bar', 'Baz']

We can also obtain the subclasses themselves using __subclasses__():

print(Foo.__subclasses__())

This will print the following list of subclasses:

[<class '__main__.Bar'>, <class '__main__.Baz'>]

To confirm that these subclasses indeed have Foo as their base class, we can use the following code:

for cls in Foo.__subclasses__():
    print(cls.__base__)

This will print the following:

<class '__main__.Foo'>
<class '__main__.Foo'>

However, it should be noted that if the class definition of a subclass has not yet been executed, it will not be found by __subclasses__. To account for this, recursion can be employed:

def all_subclasses(cls):
    return set(cls.__subclasses__()).union(
        [s for c in cls.__subclasses__() for s in all_subclasses(c)])

print(all_subclasses(Foo))

This will print:

{<class '__main__.Bar'>, <class '__main__.Baz'>, <class '__main__.Bing'>}

The above is the detailed content of How Can I Find All Subclasses of a Python Class?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn