Search code examples
pythonclassinheritanceattributesradix

Inheritance for dynamically generated classes


Contiuing from this post: Dynamically creating a class from file, type(name, bases, dict) can be used to dynamically create a class with name name, with base classes bases, and attributes dict.

I have classes such as:

class City:
    def __init__(self):
        self.name = 0
class Building:
   def __init__(self):
       self.number = 100

I want to create a new class from a string (for ex. "School"), which inherits from the above classes. I have done:

School = type("School", (City, Building), {"school_name": "abc"}
s = School()

hasattr(s, "school_name") gives True. However, hasattr(s, "name") gives False.

How can I make sure that:

  1. My dynamically generated class School inherits the attributes of its base class(es)?
  2. How can I add additional attributes to the class School after already creating the class School = type("School", (Building, Home), {"school_name": "abc"}? (Suppose I want to add two new attributes (address, pincode) to the class later on in my script - can I do that?)

Solution

  • City’s init method gets override by Building’s init method try

    hasattr(s, ‘number’)
    

    and it should return True.

    Define your class as

    class City:
        name = 0
     
    class Building:
        number = 100
    

    This way attributes can be inherited.

    For the second question, not sure about what you are asking for, but try

    School.address = ‘foo’
    School.pincode = ‘bar’