Python获取类名
所以我有一个问题,我想通过以下方式获得python类的名称:Python获取类名,python,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 但是,在创建myNa
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
时,\uuuuuuu class\uuuuuuuu.\uuuuuuuuuu name\uuuuuuuuuuu
似乎还不存在。因此,我不得不将其放入\uuuu init\uuuu()
函数中,如下所示:
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中的每个类实例创建几GB的数据,以便以后可以重复使用。所以我实际上不想继续我目前的解决方案
是否有任何方法可以获得我想要的类名?还是我只是在做梦
编辑:
谢谢你们的建议。我将花一点时间来看看元类。否则,我可能会全局创建一个字典,并引用这些实例化的类。只需使用一个方法
class TestClass(object):
@classmethod
def get_save_directory(cls):
return os.path.join(save_dir, cls.__name__)
或者您可以只使用一个class属性来指示保存目录;少施魔法通常是件好事。另外,您可以在不破坏存储的情况下更改类的名称
还有,什么?千兆字节 我想你所做的是不可能的,因为当你这样做的时候,这个类根本不存在:
myName=(在此处自动获取类名)
但是在类被解释后不久,您就可以将类对象传递给其他函数
为你做这项工作
In [1]: def save_class(cl):
myName = cl.__name__
print myName #or do whatever you wanna do here
...:
In [2]: class A:pass
In [3]: save_class(A)
A
在类定义期间,实际执行您试图执行的操作的唯一方法是使用: 或者在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
在课堂口译中,还没有“那里”。因此,是的,您最初的示例所显示的是不可能的。但是请解释为什么在这个类技术上存在之前就需要知道它 除非对这个悬而未决的问题有一个很好的答案,否则我们只能尝试从以下方面获取类名:
1. outside the interpreted class definition, uninstantiated
class demo(object):
pass
print demo.__name__ # 'demo'
2. from within the class definition, uninstantiated (or instantiated ;-)
class demo2(object):
@classmethod
def myName(cls):
return cls.__name__
print demo2.myName() # 'demo2'
print demo2().myName() # 'demo2'
or
3. within an actual instance of the class
class demo3(object):
def myClassName(self):
return self.__class__.__name__
print demo3().myClassName() # 'demo3'
除此之外,请编辑问题并添加一些详细信息,解释为什么您的初始尝试需要以您想要的方式工作,在实例化之前,但在类定义内部,而您的第二个示例存在问题。另外,saveDir是如何通过/来自的?(一个全球性的课外活动?)。也许有一种重新设计的方法可以从这里开始,实际上,如果不是字面意义上的话。除了FJ中的元类,我可以想到另外两种方法。我先从好看一点的开始。您不需要使用元类;有时,一个描述符就足够了
class ClassNameDescriptor(object):
def __get__(self, instance, owner):
return owner.__name__
class BaseClass(object):
name = ClassNameDescriptor()
class Foo(BaseClass):
pass
另一种方法是,如果您确实需要来自类主体内部的类名(不太可能),您可以窥探调用堆栈。在源代码中显示的类名位于由类定义执行的代码对象上:
import sys
def get_class_name_from_inside_class():
return sys._getframe().f_back.f_code.co_name
class Foo(object):
name = get_class_name_from_inside_class()
print name
到目前为止,只有最后一个命令允许您从类主体内部使用名称作为字符串,不幸的是,这在所有版本的python中都不起作用,值得注意的是,IronPython没有实现调用堆栈内省,因为它在DLR中不可用
有一种方法可以在不检查堆栈的情况下获得它,而且是可移植的。它与F J提供的答案类似,使用元类,但使用Python 3中可用的\uuuuuuuuuuuuuuuuuuuuuu
功能:
class namedMeta(type):
def __prepare__(mcls, name, bases, **kwargs):
return {'name': name}
class Foo(metaclass=named):
print name
试试这个。您可以通过
\u class
引用当前的类。(我正在使用python 2.7)
从python 3.3开始,您可以使用以下变量:
class TestClass():
myName = __qualname__
如果您试图在定义类之后获取它的名称,那么常量字符串属性就足够了吗?您可以在子类中更改它,如果需要的话。如果您总是使用类名,为什么不使用字符串呢?类名是静态的,因此应该没有理由继续请求它。在解释类名时,无法从类定义中获取类型名,因为尚未创建该类。可以在元类或装饰器中执行此操作。但这太疯狂了。实现留给读者作为练习。没有理由将
self.MyName
设置为self.\uuuu class\uuuuuu.\uuuuu name\uuuuuuuu
中的\uuuu init\uuuuuu()
。只需使用self.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!
class Meta(type):
def __init__(self, *args):
super(Meta, self).__init__(*args)
self._class = self
self.saveDir = str(self._class)
class Wow(object):
__metaclass__ = Meta
>>> Wow.saveDir
>>> Wow().saveDir
class TestClass():
myName = __qualname__