【问题标题】:how to create class variable dynamically in python如何在python中动态创建类变量
【发布时间】:2012-01-08 14:33:49
【问题描述】:

我需要创建一堆类变量,我想通过这样的列表循环来完成:

vars=('tx','ty','tz') #plus plenty more

class Foo():
    for v in vars:
        setattr(no_idea_what_should_go_here,v,0)

有可能吗?我不想将它们作为实例(在 __init__ 中使用 self),而是作为类变量。

【问题讨论】:

  • 为什么不将它们保存在字典中?
  • 您想在不同实例之间共享这些变量吗?
  • 不确定。最有可能的。需求来自 API,我不知道它们是如何在其中使用的。

标签: python class class-variables


【解决方案1】:

您可以在创建类后立即运行插入代码:

class Foo():
     ...

vars=('tx', 'ty', 'tz')  # plus plenty more
for v in vars:
    setattr(Foo, v, 0)

此外,您可以在创建类时动态存储变量:

class Bar:
    locals()['tx'] = 'texas'

【讨论】:

  • 啊。这很酷。我会试一试,看看我使用的 API 是否可以处理这个问题。谢谢老兄!
  • 如果覆盖了 __setattr__() 会怎样?
  • 更新...我想通了。在__setattr__() 内可以拨打super(ThisClass, self).__setattr__(varname, varvalue)
【解决方案2】:

如果出于任何原因您不能使用 Raymond 在创建类后设置它们的答案,那么也许您可以使用元类:

class MetaFoo(type):
    def __new__(mcs, classname, bases, dictionary):
        for name in dictionary.get('_extra_vars', ()):
            dictionary[name] = 0
        return type.__new__(mcs, classname, bases, dictionary)

class Foo(): # For python 3.x use 'class Foo(metaclass=MetaFoo):'
    __metaclass__=MetaFoo # For Python 2.x only
    _extra_vars = 'tx ty tz'.split()

【讨论】:

  • 这不起作用,因为您的解决方案已经硬编码了 _extra_vars 的值。
  • @MSS 你不必使用'tx ty tz'.split(),你可以替换你自己的可以引用变量的表达式。
【解决方案3】:

迟到但使用type class constructor

Foo = type("Foo", (), {k: 0 for k in ("tx", "ty", "tz")})

【讨论】:

    【解决方案4】:

    locals() 版本在课堂上不适合我。

    以下可用于动态创建类的属性:

    class namePerson:
        def __init__(self, value):
            exec("self.{} = '{}'".format("name", value)
    
    me = namePerson(value='my name')
    me.name # returns 'my name'
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 2011-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2011-02-23
      • 2016-04-19
      相关资源
      最近更新 更多