Get a method instance through 'getattr' but not superclass's method
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Sat Apr 3 18:58:01 EDT 2010
Please reply inline; top posting is harder to read.
> On Fri, Mar 12, 2010 at 12:15 AM, Gabriel Genellina
> <gagsl-py2 at yahoo.com.ar>wrote:
>
>> En Thu, 11 Mar 2010 01:47:30 -0300, Radhakrishna Bhat
>> <radhakrishna12 at gmail.com> escribió:
>>
>> I am using getattr to get a method instance from a class. But it also
>>> returns methods from the superclass. How to detect if an attribute is
>>> from
>>> superclass?
>>
>> You may look it up directly in the class dictionary (__dict__)
En Sat, 03 Apr 2010 13:37:45 -0300, Radhakrishna Bhat
<radhakrishna12 at gmail.com> escribió:>
> thanks. It is working for simple classes. But now i am trying for complex
> objects.
>
> myclassinstance.__class__.dict__ returns <dictproxy object at %$^%>
>
> Looping through the same returned dictproxy gives attributes of
> superclass.
> What am i doing wrong?
Could you provide a failing example?
It works for me in this case:
py> class MyClass(int):
... "This is my derived class"
... foo = 1
... def bar(self): pass
...
py> MyClass
<class '__main__.MyClass'>
py> MyClass.__dict__
<dictproxy object at 0x00C158F0>
py> MyClass.__dict__.keys()
['__module__', 'bar', '__dict__', 'foo', '__weakref__', '__doc__']
py> for name in MyClass.__dict__:
... print '%s: %.30r %.30r' % (name, getattr(MyClass,name),
getattr(int,name,'*does*not*exist*'))
...
__module__: '__main__' '__builtin__'
bar: <unbound method MyClass.bar> '*does*not*exist*'
__dict__: <dictproxy object at 0x00C15E7 <dictproxy object at 0x00C158F
foo: 1 '*does*not*exist*'
__weakref__: <attribute '__weakref__' of 'M '*does*not*exist*'
__doc__: 'This is my derived class' 'int(x[, base]) -> integer\n\n
foo and bar are new attributes. __module__, __dict__, __weakref__ and
__doc__ are different from the base class.
If you want to filter out the last four:
- ignore all attribute names starting and ending with two underscores:
if name[:2] == '__' == name[-2:]: continue
- ignore all attributes already present in the base class.
if hasattr(int, name): continue
--
Gabriel Genellina
More information about the Python-list
mailing list