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
Release: 2024-11-17 09:50:03
Original
227 people have browsed it

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
Copy after login

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

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

This will print the names of the subclasses:

['Bar', 'Baz']
Copy after login

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

print(Foo.__subclasses__())
Copy after login

This will print the following list of subclasses:

[<class '__main__.Bar'>, <class '__main__.Baz'>]
Copy after login

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__)
Copy after login

This will print the following:

<class '__main__.Foo'>
<class '__main__.Foo'>
Copy after login

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))
Copy after login

This will print:

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

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template