2010-01-26 10 views
14

Estoy tratando de crear un juego para mi hermanita. Es una especie de Mascota Virtual y la Mascota tiene juguetes para jugar.Creando una instancia de una clase con una variable en Python

Creé una clase Toy y quiero crear una función, getNewToy(name, data1, data2, data3, data4, data5).

Quiero que esta función cree una nueva instancia de la clase Toy, y quiero que la función pueda ser llamada varias veces cada vez creando una nueva instancia.

En mi experiencia se crea una instancia con:

class Toy: 
    def __init__(self, name, data1, data2, data3, data4, data5): 
     pass 

myToy = Toy(myToy, 1, 2, 3, 4, 5) 

continuación, utilizar métodos de la clase con:

myToy.method1() 

En vista de que yo quiero tener la capacidad de tener múltiples juguetes, cada con un método playWith(), quiero que la instancia refleje el nombre del Toy cada vez que se llama.

Quiero que la instancia sea diferente cada vez que llamo al método getNewToy(,...) y la instancia para reflejar el nombre.

+0

por "utilizar una variable" Qué quiere decir crear una instancia de clase de una cadena? – sberry

+0

¿Cuál es la clase para este objeto? ¿Sabes qué diferentes métodos de construcción hay disponibles? –

Respuesta

14

Dado su edición i se supone que tiene el nombre de la clase como una cadena y desea crear una instancia de la clase? Solo usa un diccionario como despachador.

class Foo(object): 
    pass 

class Bar(object): 
    pass 

dispatch_dict = {"Foo": Foo, "Bar": Bar} 
dispatch_dict["Foo"]() # returns an instance of Foo 
+0

Esta solución requiere una codificación rigurosa de cada clase en el diccionario. Voy a hacer eso para mi situación, pero ¿no hay forma de obtener básicamente la funcionalidad donde tienes la cadena "Foo" y de alguna manera producirás directamente una instancia de esa clase? – Addem

+0

@Addem ¿Asume que se importó? De lo contrario, ¿cómo sabrá dónde está la clase? ¿Qué hará si hay múltiples clases con el mismo nombre? Si ha sido importado, puede hacer 'locals() ['namehere']()' – Mark

0

Digamos que tiene tres clases: Enemy1, Enemy2, Enemy3. Así es como se crean instancias directamente:

Enemy1() 
Enemy2() 
Enemy3() 

pero esto también funcionará:

x = Enemy1 
x() 
x = Enemy2 
x() 
x = Enemy3 
x() 

¿Es esto lo que quería decir?

+0

No creo que esto sea lo que quiso decir. – piokuc

+1

@piokuc: Aparentemente no, dado que aceptó una respuesta diferente ~ 2.Hace 5 años – Claudiu

+0

Sí, creo que en realidad significaba algo así como 'p .__ class __.__ new__ (p____ clase__)' (nuevas clases de estilo solamente) – piokuc

8

Si no lo ha encontrado todavía, aquí está Dive into Python's chapter on object-oriented programming.

Éstos son algunos más examples, desplácese a Cuenta bancaria.


Puede llamar a una clase directamente para crear una instancia. Los parámetros se pasan al método __init__.

class Tamago(object): 
    def __init__(self, name): 
     self.name = name 

imouto = Tamago('imouto') 
oba = Tamago('oba') 
oba.name # 'oba' 
imouto.name # 'imouto' 
+0

Pero me gustaría llamar a la función varias veces, cada una creando una nueva instancia de el clas ... –

+1

Puede, intente. – Tobu

+0

los valores predeterminados se pueden establecer en los parámetros '__init__':' def __init __ (self, name = "nombre predeterminado") ' –

0

Esta es una pregunta muy extraña, específicamente de python, por lo que ser más específico definitivamente me ayudará a responderla. Como es, intentaré darle una puñalada.

Voy a suponer que lo que quiere hacer es crear una nueva instancia de una estructura de datos y darle una variable. Para este ejemplo usaré la estructura de datos del diccionario y la variable mydictionary.

mydictionary = dict() 

Esto creará una nueva instancia de la estructura de datos del diccionario y colocarlo en la variable llamada mydictionary. Como alternativa, el constructor de diccionario también puede tomar argumentos:

mydictionary = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) 

Por último, pitón intentará averiguar qué estructura de datos me refiero a partir de los datos que le doy.IE

mydictionary = {'jack': 4098, 'sape': 4139} 

Estos ejemplos fueron tomados de Here

-1

Creo que se puede utilizar eval. Algo como esto

def toclass(strcls): 
    return eval(strcls)() 
+2

Se debe evitar el uso de eval. También este método requiere que la clase sea accesible bajo el nombre de la clase. Supongamos que quiere crear una instancia de una clase llamada Foo que se encuentra en la barra de módulos, su función requiere que el usuario conozca la ubicación exacta. ¿Qué pasa si coloca la clase Foo en el mismo módulo que su función más adelante o al revés? Además, su función no devuelve una clase aunque el nombre lo sugiera. – DasIch

+0

Ya lo sé. Hay un desorden entre el nombre y el valor de retorno. Solo quiero darle otro camino por recorrer. – user247468

1

Si lo que desea es pasar una clase a una función, por lo que esta función puede crear nuevas instancias de esa clase, simplemente tratar a la clase como cualquier otro valor que le daría como un parámetro:

def printinstance(someclass): 
    print someclass() 

Resultado:

>>> printinstance(list) 
[] 
>>> printinstance(dict) 
{} 
1

en lugar de utilizar múltiples clases o la herencia de clases, tal vez una sola clase de juguete que sabe qué "tipo" es:

class Toy: 
    num = 0 
    def __init__(self, name, kind, *args): 
     self.name = name 
     self.kind = kind 
     self.data = args 
     self.num = Toy.num 
     Toy.num += 1 

    def __repr__(self): 
     return ' '.join([self.name,self.kind,str(self.num)]) 

    def playWith(self): 
     print self 

def getNewToy(name, kind): 
    return Toy(name, kind) 

t1 = Toy('Suzie', 'doll') 
t2 = getNewToy('Jack', 'robot') 
print t1 
t2.playWith() 

Ejecutarlo:

$ python toy.py 
Suzie doll 0 
Jack robot 1 

Como se puede ver, getNewToy es realmente innecesario. Ahora se puede modificar playWith para comprobar el valor de self.kind y cambios de comportamiento, puede volver a definir playWith para designar a un compañero de juegos:

def playWith(self, who=None): 
    if who: pass 
    print self 

t1.playWith(t2) 
1

Puede crear variable de la siguiente manera:

x = 10 
print(x) 

O esto:

globals()['y'] = 100 
print(y) 

Vamos a crear una clase nueva:

class Foo(object): 
    def __init__(self): 
     self.name = 'John' 

Puede crear instancia de clase de esta manera:

instance_name_1 = Foo() 

O esta manera:

globals()['instance_name_2'] = Foo() 

Vamos a crear una función:

def create_new_instance(class_name,instance_name): 
    globals()[instance_name] = class_name() 
    print('Class instance '{}' created!'.format(instance_name)) 

llamar a una función:

create_new_instance(Foo,'new_instance') #Class instance 'new_instance' created! 
print(new_instance.name) #John 

También podemos escribir la función de generador:

def create_instance(class_name,instance_name): 
    count = 0 
    while True: 
     name = instance_name + str(count) 
     globals()[name] = class_name() 
     count += 1 
     print('Class instance: {}'.format(name)) 
     yield True 

generator_instance = create_instance(Foo,'instance_') 

for i in range(5): 
    next(generator_instance) 

#out 
#Class instance: instance_0 
#Class instance: instance_1 
#Class instance: instance_2 
#Class instance: instance_3 
#Class instance: instance_4 

print(instance_0.name) #john 
print(instance_1.name) #john 
print(instance_2.name) #john 
print(instance_3.name) #john 
print(instance_4.name) #john 

#print(instance_5.name) #error.. we only created 5 instances.. 

next(generator_instance) #Class instance: instance_5 
print(instance_5.name) #John Now it works.. 
Cuestiones relacionadas