Matt Williams wrote:
> Dear List,
> 
> I'm stuck on trying to write a generic 'report' function:
> 
> Class SomeClass:
>    def __init__(self,a,b):
>       self.a = a
>       self.b = b
> 
>    def report(self):
>       for i in dir(self):
>           print self.i
> 
> <Error Traceback......>
> 
> 
> This is where I run into problems: How do I return all of the variables
> in an instance?

If you are trying to show the data attributes of an instance then Karl's 
suggestion of self.__dict__.items() is probably the best. dir() attempts to 
show all accessible attributes, which may be instance variables, class methods, 
class attributes, etc. For example:

 >>> class F(object):
 ...   def __init__(self):
 ...     self.data = 1
 ...   def show(self):
 ...     print 'data =', self.data
 ...
 >>> f=F()
 >>> dir(f)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', 
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__'
, '__repr__', '__setattr__', '__str__', '__weakref__', 'data', 'show']
 >>> f.__dict__
{'data': 1}

In this case f.__dict__ is probably what you want, not dir(f). However it's 
easy to make an example where __dict__ doesn't contain all accessible 
attributes, for example in a class that defines __slots__:
 >>> class G(object):
 ...   __slots__ = ['data']
 ...   def __init__(self):
 ...     self.data = 1
 ...
 >>> g=G()
 >>> g.__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'G' object has no attribute '__dict__'
 >>> dir(g)
['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', 
'__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__'
, '__setattr__', '__slots__', '__str__', 'data']
 >>> g.__slots__
['data']
 >>>

A class that defines __getattr__ or __getattribute__ could have attributes that 
don't appear in dir(), __dict__ or __slots__. So in general I think what you 
want is hard. For common cases __dict__ will work.

Kent





























_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to