Display all properties with reflection

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Oct 20 12:42:34 EDT 2007


En Sat, 20 Oct 2007 06:03:55 -0300, sccs cscs <zorg724 at yahoo.fr> escribi�:

> Hello,
> I like create a methode that display all the properties of an instance  
> of classe with their value.
> I try the following code: see     def __str__ (self) methode.
> But it displays only the instance attributes values not the properties  
> and their value.
> In pseudo-code:
> For Each Properties :
>    print  property_name,  property_value
>
> It is possible ? Where is the collection of properties into the Python  
> Object Metamodele?

Is this what you want, using dir()?

py> class A(object):
...   x = 1
...   @property
...   def y(self): return 2
...
py> a=A()
py> a.z=3
py>
py> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',  
'__hash__', '__init__', '__module__', '__new__', '__reduce__',  
'__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'x',  
'y', 'z']
py> for name in dir(a):
...   if name[:1]=='_': continue
...   print name, getattr(a,name)
...
x 1
y 2
z 3
py>

You may want to filter out some values, methods by example. If you usually  
don't store functions as attributes, checking if the attribute itself has  
a __call__ attribute may be enough:

py> class B(A):
...   def method1(self): pass
...   @classmethod
...   def method2(cls): pass
...   @staticmethod
...   def method3(): pass
...   def foo(self):
...     self.some_var = 1
...     def some_function(a):
...       return "hello!"
...     self.some_function = some_function
...
py> b=B()
py> b.foo()
py> dir(b)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',  
'__hash__', '__init__', '__module__', '__new__', '__reduce__',  
'__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__',  
'foo', 'method1', 'method2', 'method3', 'some_function', 'some_var', 'x',  
'y']
py> for name in dir(b):
...   if name[:1]=='_': continue
...   value = getattr(b,name)
...   if hasattr(value, '__call__'): continue
...   print name,'=',value
...
some_var = 1
x = 1
y = 2
py>

-- 
Gabriel Genellina




More information about the Python-list mailing list