使用变量实例化一个类

7 浏览
0 Comments

使用变量实例化一个类

我对Python还不太熟悉,希望有人能帮我解决一个问题。

我需要使用列表中的变量来实例化多个对象。假设我有一个包含2个元素("apple"和"orange")的列表,我想使用它们作为基于Fruit类的实例化类的名称,这样我就得到了2个对象,apple和orange,它们都属于Fruit类。

我尝试过这样做,但似乎无法弄清如何将变量名用作实例化类的名称。下面的代码无法正常工作,但可能能让你了解我想要实现的目标:

class Fruit:
    pass
my_list = ["apple", "orange"]
for item in my_list:
    item = Fruit()
type(apple)

这段代码无法正常工作,但我希望这能让你了解我想要实现的目标。我收到了以下错误:

NameError: name 'apple' is not defined

我希望看到的结果是:

>>> type(apple)

如果有人能提供任何指导,我将非常感激 🙂

谢谢!

0
0 Comments

动态创建变量通常不是一个好主意。只需使用字典代替:

fruits = {}
for item in my_list:
    fruits[item] = Fruit()
    
[(k, type(v)) for k, v in fruits.items()]
[('orange', ), ('apple', )]

我想你可以在全局范围内使用`globals()`来做类似的事情,但我认为那是非常糟糕的做法。

很高兴能够帮到你,不客气。

0
0 Comments

使用变量作为类名来实例化一个类的原因是为了动态地创建和实例化不同的类。这种需求可能出现在需要根据不同的条件或数据来选择使用不同的类进行实例化的情况下。

解决这个问题的方法是使用Python的type()函数来动态创建类。首先,需要确保基类是一个新式类,即继承自object。然后,可以使用type()函数来创建任意子类。创建子类时,需要传入一个类名、基类元组和一个包含类属性的字典。然后,可以使用创建的子类来实例化对象。

如果不需要一个共同的基类,可以将新类直接继承自object。然后,可以使用type()函数来创建新类的实例。

如果已经定义了这些类,无论是动态地创建还是静态地创建,可以使用globals()函数来查找并实例化这些类。通过调用globals()函数,可以获取到当前模块的全局变量字典,然后通过类名来查找并实例化类。

如果所有的类都定义在某个模块中,可以使用getattr()函数来动态地获取模块中的类,并进行实例化。

总结起来,通过使用type()函数或者globals()getattr()函数,可以动态地创建和实例化不同的类,从而实现使用变量作为类名来实例化一个类的需求。

0