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

时间:2012-10-01 13:17:50

标签: python class dynamic performance

我不知道我将从一开始就有多少个类实例,所以我需要动态创建它们,但我还想保持代码整洁可读。

我在考虑做这样的事情:

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

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

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

它有效,但我似乎无法找到任何人在网上这样做的例子(虽然我看起来并不多)。有什么理由我应该避免这样做吗?如果是这样,为什么以及什么是更好的选择?

3 个答案:

答案 0 :(得分: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

如果你变得有冒犯精神,你可以尝试使用元类,但我会留下你的研究: - )

答案 1 :(得分:3)

使用type(name, bases, dict)

From documentation:

  

返回一个新类型对象。这本质上是一种动态的形式   课堂陈述。名称字符串是类名,并成为   名称属性;基元元组列出基类并成为基础属性;而字典词典是   包含类主体定义的命名空间并成为    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'>

答案 2 :(得分:1)

如何使用生成器表达式创建字典?

people = dict((name, Person(name)) for name in names)

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