【发布时间】:2021-04-29 11:48:10
【问题描述】:
我有一种情况,我正在制作一堆类,其中一堆实际上基本相同,所以我想将它们制作成一个循环。它们与注册系统一起使用,因此在 USAGE 方面没有问题,但我不确定如何用确定类名的变量实际定义一个类...
简单示例:
classList = ['foo', 'bar', 'baz']
for className in classList:
class {{{className}}}_calc(BaseCalc):
def __init__ (self, dataFrame):
self.column = dataFrame[className]
def calc ():
return self.column.sum()
显然,这是一个非常简化的案例。我无法将参数更改为 init,因为其中有一大堆已经存在,它们是更大结构的一部分。
示例的其余部分使用 pandas 语法,只是为了说明它是如何使用的……但它实际上是与 SQL DB 一起使用的,而且要复杂得多……我只是不知道想要捍卫“你为什么要这样做?”我有充分的理由,就这样吧。
classname 在 class 行的 {{{ }}} 中,表示它是一个变量,实际上在语法上并不正确。问题是“我如何表示我使用 {{{ }}} 的目的?”我想。
答案可能是元类,但我仍然不确定如何使我的类变量的名称....
ETA:尝试使用@python_user 答案:
classList = ['foooo', 'bar', 'baaz']
class Base ():
def __init__ (self, buq):
self.buq = buq
def getBuq(self):
return 'buq: ' + self.buq
for cls in classList:
class TEMP(Base):
className = cls
def __init__ (self):
self.qux = len(cls)
Base.__init__(self, cls)
def blee(self, inpt):
return inpt+ self.qux
TEMP.__name__ = f'{cls}'
TEMP.__qualname__ = f'{cls}'
globals()[cls] = TEMP
f = foo()
f.getBuq()
>>>> 'buq: baaz'
这只是给我 baaz 课程。这三个都在给 baaz... 我在做一些很愚蠢的事情吗?
【问题讨论】:
-
使用 type() 创建一个具有动态分配名称的类,
type(f"MyClass{number}", (), {})。您必须在基础中填充内容并适当地听写
标签: python python-3.x class metaclass