Создание экземпляра класса с переменной в Python

Я пытаюсь создать игру для своей младшей сестры. Это виртуальное домашнее животное, и у Pet есть игрушки, с которыми можно играть.

Я создал класс Toy и хочу создать функцию getNewToy(name, data1, data2, data3, data4, data5) .

Я хочу, чтобы эта функция создала новый экземпляр класса Toy , и я хочу, чтобы функция могла быть вызвана несколько раз при создании нового экземпляра.

По моему опыту вы создаете экземпляр с:

 class Toy: def __init__(self, name, data1, data2, data3, data4, data5): pass myToy = Toy(myToy, 1, 2, 3, 4, 5) 

затем использовать методы из класса с:

 myToy.method1() 

Видя, как я хочу иметь возможность иметь несколько игрушек, каждый из которых playWith() метод playWith() я хочу, чтобы экземпляр отражал имя Toy каждый раз, когда он вызывается.

Я хочу, чтобы экземпляр отличался каждый раз, когда я вызываю метод getNewToy(,...) и экземпляр, чтобы отразить имя.

8 Solutions collect form web for “Создание экземпляра класса с переменной в Python”

Учитывая ваше редактирование, я предполагаю, что у вас есть имя класса в виде строки и вы хотите создать экземпляр класса? Просто используйте словарь в качестве диспетчера.

 class Foo(object): pass class Bar(object): pass dispatch_dict = {"Foo": Foo, "Bar": Bar} dispatch_dict["Foo"]() # returns an instance of Foo 

Если вы еще не нашли его, перейдем в раздел Python по объектно-ориентированному программированию .

Вот еще несколько примеров , прокрутите до BankAccount.


Вы можете вызвать класс непосредственно для создания экземпляра. Параметры передаются методу __init__ .

 class Tamago(object): def __init__(self, name): self.name = name imouto = Tamago('imouto') oba = Tamago('oba') oba.name # 'oba' imouto.name # 'imouto' 

Если вы просто хотите передать класс функции, чтобы эта функция могла создавать новые экземпляры этого класса, просто рассматривайте класс как любое другое значение, которое вы дадите в качестве параметра:

 def printinstance(someclass): print someclass() 

Результат:

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

Вместо того, чтобы использовать несколько классов или наследование классов, возможно, один класс Toy, который знает, что такое «вид»:

 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() 

Запуск:

 $ python toy.py Suzie doll 0 Jack robot 1 

Как вы можете видеть, getNewToy действительно не нужно. Теперь вы можете изменить playWith чтобы проверить значение self.kind и изменить поведение, вы можете переопределить playWith чтобы назначить товарища по игре:

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

Вы можете создать переменную следующим образом:

 x = 10 print(x) 

Или это:

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

Давайте создадим новый класс:

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

Вы можете создать экземпляр класса таким образом:

 instance_name_1 = Foo() 

Или так:

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

Позволяет создать функцию:

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

Вызвать функцию:

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

Также мы можем написать функцию генератора:

 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.. 

Допустим, у вас есть три класса: Enemy1, Enemy2, Enemy3. Вот как вы их создаете непосредственно:

 Enemy1() Enemy2() Enemy3() 

но это также будет работать:

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

Это то, что вы имели в виду?

Это очень странный вопрос, который нужно задать, в частности, python, поэтому, будучи более конкретным, определенно поможет мне ответить на него. Как и я, я попытаюсь нанести удар.

Я собираюсь предположить, что вы хотите сделать, это создать новый экземпляр структуры данных и дать ему переменную. В этом примере я буду использовать структуру данных словаря и переменную mydictionary.

 mydictionary = dict() 

Это создаст новый экземпляр структуры данных словаря и поместит его в переменную с именем mydictionary. Альтернативно, конструктор словаря может также принимать аргументы:

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

Наконец, python попытается выяснить, какую структуру данных я имею в виду из данных, которые я им даю. IE

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

Эти примеры были взяты из

Я думаю, вы можете использовать eval . Что-то вроде этого

 def toclass(strcls): return eval(strcls)() 
  • Как выполнить итерацию строки в Python?
  • Думает ли python, что 10 меньше 9
  • Пристрастная монета?
  • Как динамически компоновать и получать доступ к атрибутам класса в Python?
  • однострочный, чтобы проверить, существует ли хотя бы один элемент в списке в другом списке?
  • Как получить имя из именованного кортежа в python?
  • python и ip range?
  • Сценарий для извлечения данных с веб-страницы
  • Невозможно объединить объекты 'str' и 'list'
  • Elasticsearch anal () несовместим с Spark в Python?
  • как я могу контролировать производительность окон обслуживания из других окон службы с помощью библиотеки win32service и командной строки cmd в python
  • Python - лучший язык программирования в мире.