2010-01-26 3 views
14

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

Я создал a class 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() Я хочу, чтобы экземпляр отражал имя Toy каждый раз, когда он вызывается.

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

+0

путем «использовать переменную» вы имеете в виду создать экземпляр класса из строки? – sberry

+0

Что такое класс для этого объекта? Знаете ли вы, какие различные методы конструктора доступны с ним? –

ответ

14

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

class Foo(object): 
    pass 

class Bar(object): 
    pass 

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

Это решение требует жесткого кодирования каждого класса в словаре. Я собираюсь сделать это для своей ситуации, но нет ли способа получить функциональность, где у вас есть строка «Foo», и вы каким-то образом непосредственно создаете экземпляр этого класса? – Addem

+0

@Addem Вы предполагаете, что он был импортирован? В противном случае, как он узнает, где находится класс? Что он будет делать, если есть несколько классов с тем же именем? Если он был импортирован, вы можете просто сделать locals() ['nameshere']() ' – Mark

0

Предположим, у вас есть три класса: Enemy1, Enemy2, Enemy3. Это, как вы их экземпляры непосредственно:

Enemy1() 
Enemy2() 
Enemy3() 

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

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

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

+0

Я не думаю, что это то, что он имел в виду. – piokuc

+1

@piokuc: Видимо, нет, учитывая, что он принял другой ответ ~ 2.5 лет назад – Claudiu

+0

Да, я думаю, он на самом деле имел в виду что-то вроде 'p .__ class __.__ new __ (p .__ class __)' (только классы стиля) – piokuc

8

Если вы не нашли, это Dive into Python's chapter on object-oriented programming.

examples, прокрутите страницу до BankAccount.


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

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

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

Но я хотел бы, чтобы функция вызывалась несколько раз, каждый из которых создавал новый экземпляр clas ... – 2010-01-26 00:38:42

+1

Вы можете, пожалуйста, попробуйте. – Tobu

+0

значения по умолчанию могут быть заданы в параметрах '__init__':' def __init __ (self, name = "default name") ' –

0

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

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

mydictionary = dict() 

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

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

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

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

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

-1

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

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

Следует избегать использования eval. Также этот метод требует, чтобы класс был доступен под именем класса. Предположим, вы хотите создать экземпляр класса с именем Foo, который находится в панели модулей, ваша функция требует, чтобы пользователь знал точное местоположение. Что, если вы поместите класс Foo в тот же модуль, что и ваша функция, в более поздний момент или наоборот? Также ваша функция не возвращает класс, хотя это и предлагает название. – DasIch

+0

Я знаю. Между именем и возвращаемым значением существует беспорядок. Просто хочу дать ему еще один способ. – user247468

1

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

def printinstance(someclass): 
    print someclass() 

Результат:

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

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

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 назначить Playmate:

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

t1.playWith(t2) 
1

Вы можете создать переменную, как это:

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

Lets создать функцию:

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.. 
Смежные вопросы