如何动态组合和访问Python中的类属性?

Con*_*ion 22 python

我有一个Python类,其属性名为:date1,date2,date3等.

在运行时,我有一个变量i,它是一个整数.

我想要做的是根据i的值在运行时访问适当的日期属性.

例如,

如果我== 1,我想访问myobject.date1

如果我== 2,我想访问myobject.date2

我想为类而不是属性做类似的事情.

例如,我有一堆类:MyClass1,MyClass2,MyClass3等.我有一个变量k.

如果k == 1,我想实例化一个新的MyClass1实例

如果k == 2,我想实例化一个新的MyClass2实例

我怎样才能做到这一点?

编辑

我希望避免使用巨大的if-then-else语句来选择合适的属性/类.

有没有办法在Python中使用变量的值动态编写类名?

too*_*php 34

getattr()在运行时直到您不知道其名称时,可以使用它来访问属性:

obj = myobject()
i = 7
date7 = getattr(obj, 'date%d' % i) # same as obj.date7
Run Code Online (Sandbox Code Playgroud)

如果将编号的类保留在调用的模块中foo,则可以getattr()再次使用它来按编号访问它们.

foo.py:
  class Class1: pass
  class Class2: pass
  [ etc ]


bar.py:
  import foo
  i = 3
  someClass = getattr(foo, "Class%d" % i) # Same as someClass = foo.Class3
  obj = someClass() # someClass is a pointer to foo.Class3
  # short version:
  obj = getattr(foo, "Class%d" % i)()
Run Code Online (Sandbox Code Playgroud)

说了这么多之后,你真的应该避免这种事情,因为除了阅读整个代码库之外,你永远无法找到这些编号属性和类的使用位置.你最好把所有东西放在字典里.

  • 要强调最后一段带有一个大的红色标记.有两个以上的标识符具有相同的名称和最后的运行编号?重构它.也就是说,除非你得到的理由是它需要被认为是一个好理由的两倍. (4认同)

Ara*_*yan 6

对于第一种情况,您应该能够:

getattr(myobject, 'date%s' % i)
Run Code Online (Sandbox Code Playgroud)

对于第二种情况,您可以:

myobject = locals()['MyClass%s' % k]()
Run Code Online (Sandbox Code Playgroud)

但是,您首先需要这样做的事实可能表明您正以非Pythonic的方式解决问题.