Search code examples
pythonclassclass-variables

Class instance as class variable in python


I am making a class which I would like to have as a class member of a separate class so that all instances of this second class can access the first class. At the moment I have something which looks like this:

class A:
    def __init__(self):
        print "In Constructor!"

class B:
    ClassA = ''
    def __init__(self, InstanceA):
        self.ClassA = InstanceA

However, I get complaints saying "str object has no attribute..." when I try and use the ClassA class variable. Is there a way to construct class B with an argument of InstanceA and then somehow set it to be a class variable? Or any other solution for that matter!


Solution

  • You are not assigning the class attribute in B.__init__, just setting a new instance attribute - B.ClassA is still '' (None would be a more sensible starting value, by the way).

    The minimal fix is:

    class B:
    
        ClassA = None
    
        def __init__(self, InstanceA):
            self.__class__.ClassA = InstanceA # or B.ClassA = ...
    

    However, note that this changes the class attribute every time you create a new instance.


    Based on your comments, something like this may be more helpful:

    class B:
    
        ClassA = None
    
        @classmethod
        def set_class_attr(cls, instance):
            cls.ClassA = instance
    

    Which you can then use like:

    B.set_class_attr(A()) # set class attribute once
    
    b = B() # don't need to pass in new A instances when creating B instances
    b.ClassA. # ...
    

    Depending on the behaviour you want, you can check in that classmethod whether the instance has already been set and e.g. raise an error if the user tries to reset it.