Создание экземпляра класса с переменной в Python - PullRequest
18 голосов
/ 26 января 2010

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

Я создал класс 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 при каждом вызове.

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

Ответы [ 8 ]

17 голосов
/ 26 января 2010

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

class Foo(object):
    pass

class Bar(object):
    pass

dispatch_dict = {"Foo": Foo, "Bar": Bar}
dispatch_dict["Foo"]() # returns an instance of Foo
13 голосов
/ 26 января 2010

Если вы еще не нашли его, вот Окунитесь в главу 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'
1 голос
/ 16 июня 2016

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

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.. 
1 голос
/ 26 января 2010

Вместо того, чтобы использовать несколько классов или наследование классов, возможно, один класс 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)
1 голос
/ 26 января 2010

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

def printinstance(someclass):
  print someclass()

Результат:

>>> printinstance(list)
[]
>>> printinstance(dict)
{}
1 голос
/ 26 января 2010

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

Enemy1()
Enemy2()
Enemy3()

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

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

Ты это имел ввиду?

0 голосов
/ 26 января 2010

Я думаю, вы можете использовать eval. Как то так

def toclass(strcls):
    return eval(strcls)()
0 голосов
/ 26 января 2010

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

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

mydictionary = dict()

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

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

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

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

Эти примеры были взяты из Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...