Domanda

Voglio sapere come usare le variabili per oggetti e nomi di funzioni in Python. In PHP, puoi farlo:

$className = "MyClass";

$newObject = new $className();

Come si fa questo genere di cose in Python? Oppure, non sto assolutamente apprezzando alcune differenze fondamentali con Python e, in caso affermativo, che cos'è?

È stato utile?

Soluzione

In Python,

className = MyClass
newObject = className()

La prima riga fa in modo che la variabile className faccia riferimento alla stessa cosa di MyClass . Quindi la riga successiva chiama il costruttore MyClass tramite la variabile className .

Come esempio concreto:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(In Python, list è il costruttore della classe list .)

La differenza è che in PHP rappresenti il ??nome della classe a cui vuoi fare riferimento come stringa, mentre in Python puoi fare riferimento direttamente alla stessa classe. Se devi utilizzare una stringa (ad esempio se il nome della classe viene creato in modo dinamico), dovrai utilizzare altre tecniche.

Altri suggerimenti

Supponendo che some_module abbia una classe denominata " class_name " ;:

import some_module
klass = getattr(some_module, "class_name")
some_object = klass()

Dovrei notare che dovresti stare attento qui: trasformare le stringhe in codice può essere pericoloso se la stringa proviene dall'utente, quindi dovresti tenere presente la sicurezza in questa situazione. :)

Un altro metodo (supponendo che stiamo ancora usando " class_name "):

class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']()  #call the object once we've pulled it out of the dict

Quest'ultimo metodo è probabilmente il modo più sicuro per farlo, quindi è probabilmente quello che dovresti usare se possibile.

Se devi creare una classe dinamica in Python (cioè una il cui nome è una variabile) puoi usare type () che accetta 3 parametri: nome, basi, attrs

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • Si noti tuttavia che ciò non "crea un'istanza" dell'oggetto (ovvero non chiama costruttori, ecc. Crea una nuova classe (!) con lo stesso nome.

Se hai questo:

class MyClass:
    def __init__(self):
        print "MyClass"

Quindi di solito fai questo:

>>> x = MyClass()
MyClass

Ma potresti anche farlo, che è quello che penso tu stia chiedendo:

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

Ma fai molta attenzione a dove ottieni la stringa che usi " eval () " on - se viene dall'utente, essenzialmente stai creando un enorme buco di sicurezza.

Aggiornamento: l'utilizzo di type () come mostrato nella risposta di coleifer è di gran lunga superiore a questa soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top