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
但是,似乎在创建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