Search code examples
python-2.7inheritanceapache-storm

Object has no attribute '__bases__' when calling inspect.getmro()


I have a python class that inherits from storm.py from the Apache Storm MultiLang project.

My class looks like the following:

import storm
class MyClassName(Storm.Bolt):
def initialize(self,conf,context):
     self._conf = conf;
     self._context = context
def process(self, in_tuple):
     storm.ack(in_tuple)
if __name__ == '__main__':
     MyClassName().run()

I copied my python file (myfilename.py) out to /usr/lib64/python2.7/site-package. I then logged into the python shell and did an import myfilename. That completed without error. When I run the following inspect.getmro(myfilename.MyClassName()) I get the following error:

AttributeError: 'MyClassName' object has no attribute '__bases__' 

I was under the impression that when I declared my class and passed it Storm.Bolt that I was extending Storm.Bolt. My questions are:

  • Do I need to define __bases__ in my class?
  • What else am I missing?

Using Python 2.7.13 on CentOs7. Storm version is 1.1.0


Solution

  • The inspect.getmro function expects its argument to be a class, but you're passing it an instance. Get rid of the parentheses that call the class and your code should work:

    inspect.getmro(myfilename.MyClassName) # not MyClassName()!
    

    If the call you gave in the question was a simplified example and you don't have the class directly available where you're calling getmro on the instance, you can use type to get the class:

    obj = SomeClass()  # this happens somewhere earlier on, and we don't know SomeClass below
    
    inspect.getmro(type(obj))   # but we can easily get it using type()