gpt4 book ai didi

python - 根据 Python 中的名称列表生成类

转载 作者:行者123 更新时间:2023-11-30 22:11:19 25 4
gpt4 key购买 nike

这种方法一开始可能就是错误的,但我正在尝试执行以下操作:

class Material:
pass


class Vacuum(Material):
def __str__(self):
return 'vacuum'


class Aluminum(Material):
def __str__(self):
return 'aluminum'


class Graphite(Material):
def __str__(self):
return 'graphite'


class Beryllium(Material):
def __str__(self):
return 'beryllium'

我有处理不同 Material 的不同代码段。我宁愿给它对象,而不是将字符串作为参数传递给其他部分。这允许使用 ipython 进行制表符补全,这也是强制类型的一种方法。

为了避免更改已经编写的片段,这些只会执行 str(argument) :如果它是一个字符串,它将恢复旧的行为,如果它是一个对象,它将起作用。

现在的问题是:我想支持给定的 Material 列表:

allowed_materials = ['vacuum', 'aluminum', 'graphite',]

而且这个列表可能还在不断增长。我如何根据列表生成类,而不是手动编写类?

最佳答案

您可以定义一个元类来为您生成类。

class mattype(type):
def __new__(mcls, name, bases=(), d=None):
def __str__(self):
return name.lower()
if not d:
d = {}
d['__str__'] = __str__
bases = (*bases, Material)
return super().__new__(mcls, name.title(), bases, d)

allowed_materials = ['vacuum', 'aluminum', 'graphite',]
classes = {name: mattype(name) for name in allowed_materials}
str(classes['vacuum']())
# 'vacuum'

关于python - 根据 Python 中的名称列表生成类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51456470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com