Python获取类nam

2024-09-27 17:34:33 发布

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

所以我遇到了这个问题,我想用这种方式获取一个python类的名称:

class TestClass():
    myName = (get class name here automatically)
    saveDirectory = os.path.join(saveDir, myName) # so i can save it in unique location
    def __init__(self):
        pass # do something

然而,似乎__class__.__name__在创建myName时实际上还不存在。所以我不得不把它放到__init__()函数中,如下所示:

class TestClass():
    def __init__(self):
        self.myName = self.__class__.__name__
        saveDirectory = os.path.join(saveDir, self.myName) # so i can save it in unique location
        pass # do something

但这有一个大问题,因为在实例化类之前,我无法获取类的名称,所以我需要为要保存在saveDirectory中的类的每个实例创建一些千兆字节的数据,以便以后可以重用。所以我不想继续我目前的解决方案。

有没有我想要的类名?还是我只是在做梦?

编辑:

谢谢你们的建议。我将花一点时间来看看元类。否则,我可能会全局创建一个字典,并引用这些实例化的类。


Tags: path实例nameself名称soinitos
3条回答

只是用一种方法?

class TestClass(object):
    @classmethod
    def get_save_directory(cls):
        return os.path.join(save_dir, cls.__name__)

或者您可以只使用一个表示保存目录的类属性;减少魔法通常是一件好事。另外,您可以在以后更改类的名称而不破坏存储空间。

还有,什么?千兆字节?!

在类定义期间实际执行所尝试的操作的唯一方法是使用metaclass

def saveDirMeta(name, bases, dct):
    dct['saveDirectory'] = os.path.join(saveDir, name)
    return type(name, bases, dct)

class TestClass(object):
    __metaclass__ = saveDirMeta  # this adds the 'saveDirectory' attribute
    def __init__(self):
        pass # do something

或者在Python 3.x上:

class TestClass(metaclass=saveDirMeta):
    def __init__(self):
        pass # do something

这显然比仅使用以下方法更不清楚:

class TestClass():
    saveDirectory = os.path.join(saveDir, 'TestClass')
    def __init__(self):
        pass # do something

自python 3.3以来,您可以使用^{}变量:

class TestClass():
    myName = __qualname__

相关问题 更多 >

    热门问题