Metaclasă

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programarea orientată obiect , o metaclasă este o clasă ale cărei instanțe sunt în sine clase. Acest concept este strâns legat de conceptul de reflecție (reflecție), care se aplică acelor instrumente conceptuale care vă permit să reprezentați, în cadrul unui program, informații despre părțile constitutive ale programului (de obicei clase și obiecte).

Conceptul de metaclasă este utilizat în principal la nivel teoretic (apare, de exemplu, în definiția formală a semanticii limbajului de modelare unificat ), dar găsește și aplicații directe în diferite limbaje de programare . În Java , de exemplu, toate clasele sunt considerate conceptual instanțe ale unei singure Class metaclasă, în type Python este o metaclasă.

Piton

În Python, o metaclasă este definită în cea mai mare parte ca o subclasă de tip.

 clasa AttributeInitType ( tip ):
     def __call__ ( self , * args , ** kwargs ):
         "" "Creați o nouă instanță." ""
 
         # Mai întâi, creați obiectul în modul implicit normal.
         obj = tip . __suna__ ( auto , * argumente )
 
         # În plus, setați atribute pentru noul obiect.
         pentru nume , valoare în kwargs . articole ():
             setattr ( obj , nume , valoare )
 
         # Returnează noul obiect.
         întoarce obiect

Această metaclasă suprascrie doar crearea obiectului. Toate celelalte aspecte ale clasei și comportamentului obiectului sunt încă tratate în funcție de tip. Acum, clasa Mașină poate fi rescrisă pentru a utiliza această metaclasă. În Python 2 acest lucru se realizează prin atribuirea __metaclass__ în definiția clasei în timp ce în Python 3 dând argumentul clasei metaclasă = M )

 clasa Mașină ( obiect ):
     __metaclass__ = AttributeInitType
     __slots__ = [ 'make' , 'model' , 'year' , 'color' ]
 
     @proprietate
     descriere def ( auto ):
         "" "Returnează o descriere a acestei mașini." ""
         returnează  % s % s % s % s " % ( auto . culoare , auto . an , auto . marca , auto . model )

Obiectele Car pot fi instanțiate astfel:

 masini = [
     Mașină ( marca = 'Toyota' , model = 'Prius' , an = 2005 , culoare = 'verde' ),
     Mașină ( marca = 'Ford' , model = 'Prefect' , an = 1979 , culoare = 'albastru' )]

Un alt exemplu de Metaclasă în Python:

 clasa Vrajă ( tip ):
    def __new__ ( cls , classname , super , classdict ):
        def pph ( ore ): return lambda self : self . pay_per_hour * ore

        classdict [ 'pay_per_hour' ] = 12
        classdict [ 'day_salary' ] = pph ( 8 )
        classdict [ 'week_salary' ] = pph ( 8 * 5 )
        classdict [ 'year_salary' ] = pph ( 8 * 5 * 4 * 12 )
        classdict [ 'month_salary' ] = pph ( 8 * 5 * 4 )
        tip retur . __new__ ( cls , classname , super , classdict )

Person (metaclass = ortografică):
    def __init__ (auto, nume, prenume, bday):
        sinele . nume = nume
        sinele . prenume = prenume
        sinele . bday = bday

    def get_name ( auto ):
        a reveni auto. _Nume
    def get_lastname ( self ):
        a reveni auto. _nume
    def get_bday ( self ):
        a reveni auto. _ziua
    def __repr__ ( auto ):
        returnează „nume: {0} , prenume: {1} , bday: {2}  . format ( self . nume , self . prenume , self . bday )
      
dacă __name__ == "__main__" :
    persona = Person ( "Mario" , "Rossi" , "23 noiembrie 65" )

Limbi care acceptă metaclasele

Elemente conexe