【问题标题】:What is the most efficient way to dynamically create class instances?动态创建类实例的最有效方法是什么?
【发布时间】:2012-09-22 08:23:36
【问题描述】:

我不知道一开始我会有多少类实例,所以我需要动态创建它们,但我也想保持代码的整洁和可读性。

我正在考虑做这样的事情:

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

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

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

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

【问题讨论】:

  • 就我所见,您说的是动态创建对象,而不是,对吗?
  • 你的意思是动态创建类实例??
  • 在上面的代码中,您没有动态创建任何类,只定义了一个类Person,然后创建了它的三个实例。这是一种完全合法的做法,看不到任何问题。
  • 是的,你是对的。对不起,我混淆了我的术语。

标签: python class dynamic performance


【解决方案1】:

如果您想动态创建类实例,这正是您在代码中所做的,那么我认为您的解决方案看起来非常好,并且是一种 Python 方法(尽管我不得不说当然还有其他方法)。只是为了给您一些思考:您可以像这样在类中注册/存储每个新实例:

class Person():
    people={}
    @classmethod
    def create(cls,name):
        person=Person(name)
        cls.people[name]=person
        return person
    def __init__(self, name):
        self.name = name

如果你喜欢冒险,你可以尝试使用元类,但我会把它留给你研究 :-)

【讨论】:

    【解决方案2】:

    使用type(name, bases, dict)

    From documentation:

    返回一个新的类型对象。这本质上是一种动态的形式 类声明。名称字符串是类名并成为 名称属性;基元组逐项列出基类并成为 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'>
    

    【讨论】:

      【解决方案3】:

      使用生成器表达式创建字典怎么样?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多