In [3]:
wcs = set()

class Chroma():
    def __init__(self, name):
        self.name = name
        wcs.add(self)
        
    def __repr__(self):
        return self.name
        
    def __call__(self, f):
        print("called")
        def new_call(i):
            return f(self, i)
        self.__call__ = new_call
        
 
C = Chroma("C")
D = Chroma("D")
E = Chroma("E")

In [4]:
C


Out[4]:
C

In [6]:
class Pitch():

    def __init__(self, chroma, octave):
        self.chroma = chroma
        self.octave = octave

    def __repr__(self):
        return self.chroma.__repr__() + str(self.octave)

for chroma in wcs:
    chroma(Pitch)

In [8]:
C(1)