Uso della classe come un oggetto in Python

2

Sto imparando da Impara Python nel modo più duro dove mi sono imbattuto in una esercitazione di studio in cui vogliono sapere se una classe può essere usata come un oggetto.

Come ho sperimentato:

class A(object):
    def __init__(self):
        print "in here"
    def cat(self,name):
        print "my cat ",name

Qui se scrivo A.cat(A(),"Tom") , funziona e ha scoperto che il suo metodo di chiamata non associata. Ora, vuol dire che posso assumere che le classi possano essere usate come un oggetto?

    
posta Angel 24.06.2014 - 17:34
fonte

1 risposta

2

Tutto in Python è un oggetto, incluse le classi.

Questo significa che puoi fare riferimento a classi, passarle come argomenti, memorizzarle in attributi, nomi (extra), elenchi, dizionari, ecc.

Questo è perfettamente normale in Python:

class_map = {
    'foo': A,
    'bar': SomeOtherClass,
    'baz': YetAnother,
}

instance = class_map[some_variable]()

Ora dipende da some_variable quale classe è stata scelta per creare un'istanza; i valori del dizionario class_map sono tutte le classi.

Le classi sono esse stesse istanze del loro tipo ; questo è chiamato il loro metaclass . Puoi produrre una nuova classe chiamando type() con un nome, una sequenza di classi base e un mapping che definisce gli attributi della classe:

type('DynamicClass', (), {'foo': 'bar'})

crea un nuovo oggetto di classe, con un attributo foo impostato su bar , ad esempio. La classe prodotta può quindi essere utilizzata per creare istanze. Quindi le classi sono prodotte da metaclassi, così come le istanze sono prodotte dalle classi.

Puoi produrre i tuoi metaclassi ereditando da type , aprendo un mondo strano e meraviglioso di comportamento di classe.

Chiamare un metodo non associato passando in un'istanza separata non è davvero un buon esempio dell'uso delle classi come oggetto. Tutto ciò che hai fatto è stato utilizzare il riferimento iniziale (il nome della classe) per cercare il metodo, quindi passare un'istanza della classe come primo parametro da sostituire per self .

    
risposta data 24.06.2014 - 17:53
fonte

Leggi altre domande sui tag