File: LP6E/Chapter40/extend_meta.py

"Extend a class with a metaclass"

def triple(obj):
    return obj.value * 3                                  # Functions to insert
                                                          # Methods if in a class
def concat(obj):                                          # Where "obj" is "self"
    return obj.value + 'Code!'

class Extender(type):
    def __new__(meta, classname, supers, classdict):      # On client-class creation
        classdict['triple'] = triple                      # Add funcs as attributes 
        classdict['concat'] = concat
        return type.__new__(meta, classname, supers, classdict)

class Client1(metaclass=Extender):
    def __init__(self, value):                            # Created from Extender
        self.value = value                                # Own + inserted methods
    def double(self):
        return self.value * 2

class Client2(metaclass=Extender):                        # Created from Extender
    value = 'grok'                                        # Inherited class data

X = Client1('hack')                                       
print(X.double(), X.triple(), X.concat(), sep='\n')

Y = Client2()                                             
print(Y.triple(), Y.concat(), sep='\n')



[Home page] Books Code Blog Python Author Train Find ©M.Lutz