Suppose I have a class, defined, for example, thus:
class testclass(): cl = [] def __init__(self, x): self.cl.append(x)
Now, I want to create a class which is identical to testclass except I don’t want testclass’ state cl
, but rather its own individual state.
Experiment shows that inheriting from testclass
inherits cl
, so that does not work. Any words of wisdom appreciated. Does this require the whole metaclass machinery? (which I don’t quite understand enough yet)
Advertisement
Answer
A metaclass isn’t so hard here if you just think of it as a subclass of the class type. You can give it an __init__()
that sets the cl
list just like you would for an instance and each class get’s its own class property:
class Meta(type): def __init__(cls, *args): cls.cl = [] class testclass(metaclass=Meta): def __init__(self, n): self.cl.append(n) class t_child(testclass): pass t = testclass(10) print(t.cl) # [10] t2 = testclass(20) print(t2.cl) # [10, 20] t3 = t_child(100) print(t3.cl) # [100] t4 = t_child(100) print(t4.cl) # [100, 100] t5 = testclass(30) print(t5.cl) # [10, 20, 30]