基于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中返回此属性。我同意,我也考虑过,但最终类将做的不仅仅是这些。谢谢。我必须看看这和我现在做的相比。