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

所以我有一个问题,我想通过以下方式获得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
时,
\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__