Get the list of a class's variables & methods in Python
Solution 1
If the class and its superclasses are known, something like:
tuple(set(dir(Foo)) - set(dir(Bar)))
If you want it to be more generic, you can get a list of the base classes using something like
bases = Foo.mro()
...and then use that list to subtract out attributes from all the base classes.
Solution 2
In your example, a
is an instance, its __dict__
will include all variables set in its __init__
function. To get all class variables, use a.__class__.__dict__
Solution 3
A third answer is the inspect module which does the same as above
Solution 4
def getVariablesClass(inst):
var = []
cls = inst.__class__
for v in cls.__dict__:
if not callable(getattr(cls, v)):
var.append(v)
return var
if you want exclude inline variables check names on the __ at the start and the end of variable
Related videos on Youtube
BVMiko
I was a Systems Administrator for 5 years, and have been programming for 20. My favorite language is Python, but lately have been doing Android development using Java. I've been exclusively an Ubuntu Linux user for the past 5 years; before that I ran a blend of Windows and Linux machines.
Updated on March 03, 2021Comments
-
BVMiko about 3 years
If I have the following class, what's the best way of getting the exact list of variables and methods, excluding those from the superclass?
class Foo(Bar): var1 = 3.14159265 var2 = Baz() @property def var3(self): return 42 def meth1(self, var): return var
I want the tuple
('var1','var2','var3','meth1')
with minimum overhead. This is being run in a Django environment, which seems to be putting some of it's class instance variables in the read-only__dict__
variable; a feat which I can't find a way to replicate.Here's what I'm seeing while playing with it, any suggestions beyond trimming out the
__*
from the dir() or manually listing them?>>> a=Foo() >>> a <__main__.Foo instance at 0x7f48c1e835f0> >>> dict(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: iteration over non-sequence >>> dir(a) ['__doc__', '__module__', 'meth1', 'var1', 'var2', 'var3'] >>> a.__dict__ {}
-
BVMiko about 13 yearsI'm going to use your technique in my project, as the base class is predictable. I'll also implement some caching routine and save it as a method variable, thanks for the set manipulation tip!
-
Petri over 9 yearskeep in mind that mro() only works for new-style classes ie. those subclassing from 'object'