July 2002
Intermediate to advanced
608 pages
15h 46m
English
Credit: Jürgen Hermann, Alex Martelli
You need to map all members of a class, including inherited members, into a dictionary of class attribute names.
Here is a solution that works portably and transparently on both new-style (Python 2.2) and classic classes with any Python version:
def all_members(aClass):
try:
# Try getting all relevant classes in method-resolution order
mro = list(aClass._ _mro_ _)
except AttributeError:
# If a class has no _ _mro_ _, then it's a classic class
def getmro(aClass, recurse):
mro = [aClass]
for base in aClass._ _bases_ _: mro.extend(recurse(base, recurse))
return mro
mro = getmro(aClass, getmro)
mro.reverse( )
members = {}
for someClass in mro: members.update(vars(someClass))
return membersThe
all_members
function in this recipe creates a dictionary that includes each
member (such as methods and data attributes) of a class with the name
as the key and the class attribute value as the corresponding value.
Here’s a usage example:
class Eggs:
eggs = 'eggs'
spam = None
class Spam:
spam = 'spam'
class Breakfast(Spam, Eggs):
eggs = 'scrambled'
print all_members(Eggs)
print all_members(Spam)
print all_members(Breakfast)And here’s the output of this example (note that the order in which each dictionary’s items are printed is arbitrary and may vary between Python interpreters):
{'spam': None, '_ _doc_ _': None, 'eggs': 'eggs', '_ _module_ _': '_ _main_ _'} {'spam': 'spam', '_ _doc_ _': None, ...