2009-09-21 5 views
0

Disons que j'ai ceci:Étant donné un type de classe comment créer une instance en Python?

class whatever(object): 
    def __init__(self): 
     pass 

et cette fonction:

def create_object(type_name): 
    # create an object of type_name 

Je voudrais être en mesure d'appeler le create_object comme ceci:

inst = create_object(whatever) 

et retourner une instance de whatever. Je pense que cela devrait être possible sans utiliser eval, je voudrais savoir comment faire cela. Veuillez noter que je suis PAS en utilisant une chaîne comme paramètre pour create_object.

+0

Quel tutoriel Python lisez-vous, @Geo? Votre question indique que le didacticiel ne contient pas d'informations importantes. Lequel avez-vous lu? –

Répondre

7

La façon la plus évidente:

def create_object(type_name): 
    return type_name() 
+0

Il ne m'a pas traversé l'esprit que 'type_name' est appelable. – Geo

+0

Les classes sont juste des objets normaux de première classe en Python, partageant le même espace de noms que n'importe quelle autre variable. – bobince

2

Si je comprends bien, ce que vous voulez est:

def create_object(type_name, *args): 
    # create an object of type_name 
    return type_name(*args) 

inst = create_object(whatever) 

Je ne sais pas vraiment pourquoi vous voulez faire cela, mais je être intéressant d'entendre de vous quelles sont vos raisons d'avoir besoin d'une telle construction.

+0

Je voulais juste savoir si cela pouvait se faire sans eval :) – Geo

+1

'eval' et son frère plus laid et méchant,' exec' sont rarement nécessaires, voire pas du tout. 'eval' est utile pour évaluer l'entrée de l'utilisateur, tant que vous prenez des mesures pour ne pas utiliser l'application' globals' et 'locals'. – voyager

2
def create_object(type_name): 
    return type_name() 

vous pouvez bien sûr ignorer la fonction tout à fait et créer l'instance de whatever comme ceci:

inst = whatever() 
5
def create_object(typeobject): 
    return typeobject() 

Comme vous l'avez dit pas explicitement que le arg à create_object est pas censé être un chaîne, je suppose qu'il est censé être l'objet type lui-même, tout comme dans l'exemple create_object(whatever) que vous donnez, dans lequel whatever est en effet le type lui-même.

Questions connexes