2010-03-14 11 views

Odpowiedz

2

Chciałbym usłyszeć komentarze ludzi na ten temat, ale myślę, że jest to przykład tego, co chcesz zrobić

class FactoryMetaclassObject(type): 
    def __init__(cls, name, bases, attrs): 
     """__init__ will happen when the metaclass is constructed: 
     the class object itself (not the instance of the class)""" 
     pass 

    def __call__(*args, **kw): 
     """ 
     __call__ will happen when an instance of the class (NOT metaclass) 
     is instantiated. For example, We can add instance methods here and they will 
     be added to the instance of our class and NOT as a class method 
     (aka: a method applied to our instance of object). 

     Or, if this metaclass is used as a factory, we can return a whole different 
     classes' instance 

     """ 
     return "hello world!" 

class FactorWorker(object): 
    __metaclass__ = FactoryMetaclassObject 

f = FactorWorker() 
print f.__class__ 

Wynik zobaczysz: wpisz 'str'

+0

czy można dodać trochę "faktyczności" do przykładu, tj. Pewne dostosowanie zastosowane do tworzonych obiektów? – olamundo

0

Nie ma potrzeby. Możesz zwrócić override a class's __new__() method, aby zwrócić zupełnie inny typ obiektu.

+0

Nie sądzę, że możesz z metaclasses ... (może możesz - jeśli tak, daj mi znać, a dowiem się czegoś :)) – RyanWilcox

2

Można znaleźć kilka pomocnych przykładów na wikibooks/python, here i here

+1

to są dokładnie linki, na które natknąłem się. Nie mogłem znaleźć konkretnego przykładu fabryki (choć wszyscy o tym wspominali) w którymkolwiek z nich ... – olamundo

Powiązane problemy