基于Python中的名称列表生成类
这种方法一开始可能是错误的,但我试图做到以下几点:基于Python中的名称列表生成类,python,python-3.x,Python,Python 3.x,这种方法一开始可能是错误的,但我试图做到以下几点: 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)
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'
我有处理不同材料的不同代码段。与其将字符串作为参数传递给其他片段,我更愿意为其提供对象。这允许使用ipython
完成制表符,也是强制执行类型的一种方法
为了避免更改已经编写的代码,这些代码只需执行str(argument)
:如果它是字符串,它将恢复旧的行为,如果它是它将工作的对象之一
现在的问题是:我想支持给定的材料列表:
allowed_materials = ['vacuum', 'aluminum', 'graphite',]
这个名单可能会越来越多。如何根据列表生成类,而不是手动编写类?如果不同的材质不需要不同的类名,只需在材质类中初始化即可。如果没有,我将删除我的答案
class Material:
def __init__(self,name):
self.name=name
def __str__(self):
return self.name
allowed_materials = ['vacuum', 'aluminum', 'graphite',]
obj_lst=[Material(material) for material in allowed_materials]
for obj in obj_lst:
print(str(obj))
输出:
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'
最后我做了以下工作,还向模块添加了对象
import sys
class Material:
def __str__(self):
return self.__class__.__name__
pass
print(sys.modules[__name__])
_materials = ['Copper', 'Vacuum']
for m in _materials:
setattr(sys.modules[__name__], m, type(m, (Material,), {})())
所有材料都需要不同的等级吗?或者名称可以是类
材质的属性
?类可以在\uuu str\uuu
@PRMoureu中返回此属性。我同意,我也考虑过,但最终类将做的不仅仅是这些。谢谢。我必须看看这和我现在做的相比。