在Python中使用变量创建类的实例

23 投票
8 回答
130674 浏览
提问于 2025-04-15 18:28

我正在为我妹妹制作一个游戏。这是一个虚拟宠物的游戏,宠物有玩具可以玩。

我创建了一个叫 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() 方法,所以我希望每次调用时,实例能反映出玩具的名字。

我希望每次调用 getNewToy(,...) 方法时,实例都是不同的,并且能显示出玩具的名字。

8 个回答

4

你可以这样创建变量:

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

如果你还没找到,这里有一个链接,里面有关于面向对象编程的内容,来自《Dive into Python》的章节:Dive into 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'
25

根据你的修改,我猜测你是想把类名作为字符串,然后创建这个类的实例?你可以用一个字典来作为调度器。

class Foo(object):
    pass

class Bar(object):
    pass

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

撰写回答