Python 获取类名

20 投票
7 回答
38313 浏览
提问于 2025-04-17 13:36

我遇到了一个问题,我想以这种方式获取一个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

但是,似乎在创建myName的时候,__class__.__name__实际上还不存在。所以我被迫把它放进__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

但这样有个大问题,因为我必须等到实例化这个类后才能获取类的名字。我打算为每个类的实例创建几GB的数据,并把它们保存在一个叫做saveDirectory的地方,以便以后可以重复使用。所以我其实不想继续用我现在的解决方案。

有没有办法按照我想要的方式获取类名?还是说我只是做梦呢?

编辑:

谢谢大家的好建议。我打算花点时间看看元类(Metaclasses)。否则,我可能会在全局创建一个字典,并引用这些实例化的类。

7 个回答

9

直接用一个方法就行了?

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

或者你可以设置一个类属性来表示保存的目录;少一些复杂的东西通常是个好主意。而且你以后可以改这个类的名字,而不会影响到你的存储。

还有,什么?几GB?!

16

从Python 3.3开始,你可以使用一个叫做 __qualname__ 的变量:

class TestClass():
    myName = __qualname__
7

在定义类的时候,想要实现你所说的功能,唯一的方法就是使用一个叫做元类的东西:

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

撰写回答