动态创建类实例的最有效方法是什么?

4

我不知道从一开始会有多少类实例,因此需要动态创建它们,但我希望代码保持整洁和易读。

我在考虑像这样做:

names = ['Jon','Bob','Mary']

class Person():
    def __init__(self, name):
        self.name = name

people = {}
for name in names:
    people[name] = Person(name)

虽然这样做是可行的,但我似乎找不到网上有人这样做的例子(尽管我没有仔细查看)。我应该避免这样做吗?如果是的话,为什么,有更好的替代方案吗?


5
根据我所看到的,您在谈论动态创建对象,而不是,我说得对吗? - Jonas Schäfer
你的意思是动态创建类实例吗? - Rohit Jain
3
在上面的代码中,你没有动态创建任何类,只定义了一个名为“Person”的类,然后创建了三个该类的实例。这是一种完全合法的方式,我看不出有任何问题。 - bereal
是的,你说得对。很抱歉我混淆了术语。 - TimY
3个回答

5
如果您想动态创建类实例,这正是您在代码中所做的,那么我认为您的解决方案看起来非常好,是一种Pythonic的方法(虽然我不得不说当然还有其他方法)。只是为了给您一些启示:您可以像这样注册/存储每个新实例到类中:
class Person():
    people={}
    @classmethod
    def create(cls,name):
        person=Person(name)
        cls.people[name]=person
        return person
    def __init__(self, name):
        self.name = name

如果你想冒险一试,也可以尝试使用元类来实现相同的功能,但我会把这留给你自己去研究 :-)


3

使用 type(name, bases, dict)

来自文档:

返回一个新的类型对象。这本质上是类语句的动态形式。名称字符串是类名并成为name属性;基类元组列出了基类并成为bases属性;字典是包含类体定义的命名空间,并成为dict属性。例如,以下两个语句创建相同的类型对象:

>>> class X(object):
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))

针对您的示例:

>>> JonClass = type('JonClass', (object,), {'name': 'Jon'})
>>> jon_instance = JonClass()
>>> jon_instance.name
'Jon'
>>> type(jon_instance)
<class '__main__.JonClass'>

1
如何使用生成器表达式来创建字典?
people = dict((name, Person(name)) for name in names)

但除此之外,你的解决方案是完全有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接