基于Python中的名称列表生成类

2024-04-27 23:08:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这种方法一开始可能是错误的,但我正试图做到以下几点:

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',]

这个名单可能会越来越多。如何根据列表生成类,而不是手动编写类


Tags: 对象方法字符串self列表returndef错误
3条回答

如果不同的材质不需要不同的类名,只需在material类中初始化即可。否则我将删除我的答案

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

我完成了以下操作,还向模块中添加了对象

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,), {})())

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

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'

相关问题 更多 >