In [1]:
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 [7]:
C.test()


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-66d37718b336> in <module>()
----> 1 C.test()

AttributeError: 'Chroma' object has no attribute 'test'

In [3]:
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)


called
called
called

In [4]:
C(1)


called