获取当前课程的名称?

时间:2011-08-04 14:25:24

标签: python class

如何获取我目前所在班级的名称?

示例:

def get_input(class_name):
    [do things]
    return class_name_result

class foo():
    input = get_input([class name goes here])

由于我与(vistrails)接口的程序的性质,我无法使用__init__()来初始化input

8 个答案:

答案 0 :(得分:126)

obj.__class__.__name__会为您提供任何对象名称,因此您可以执行此操作:

class Clazz():
    def getName(self):
        return self.__class__.__name__

用法:

>>> c = Clazz()
>>> c.getName()
'Clazz'

答案 1 :(得分:19)

在类的主体内,类名尚未定义,因此不可用。你能不能简单地输入班级的名字?也许您需要更多地谈论这个问题,以便我们为您找到解决方案。

我会创建一个元类来为你完成这项工作。它在类创建时调用(概念上在类的最后:block),并且可以操作正在创建的类。我没有测试过这个:

class InputAssigningMetaclass(type):
    def __new__(cls, name, bases, attrs):
        cls.input = get_input(name)
        return super(MyType, cls).__new__(cls, name, bases, newattrs)

class MyBaseFoo(object):
    __metaclass__ = InputAssigningMetaclass

class foo(MyBaseFoo):
    # etc, no need to create 'input'

class foo2(MyBaseFoo):
    # etc, no need to create 'input'

答案 2 :(得分:14)

您可以通过类'私有属性:

访问它
cls_name = self.__class__.__name__

修改

正如Ned Batcheler所说,这不会在类体中起作用,但它会在方法中起作用。

答案 3 :(得分:8)

编辑:是的,你可以;但你必须作弊:当前运行的类名存在于调用堆栈中,traceback模块允许您访问堆栈。

>>> import traceback
>>> def get_input(class_name):
...     return class_name.encode('rot13')
... 
>>> class foo(object):
...      _name = traceback.extract_stack()[-1][2]
...     input = get_input(_name)
... 
>>> 
>>> foo.input
'sbb'

然而,我不会这样做;我原来的答案仍然是我自己的偏好作为解决方案。原始答案:

可能最简单的解决方案是使用装饰器,类似于Ned的涉及元类的答案,但功能较弱(装饰者能够使用黑魔法,但是元类能够古老,神秘黑色魔法)

>>> def get_input(class_name):
...     return class_name.encode('rot13')
... 
>>> def inputize(cls):
...     cls.input = get_input(cls.__name__)
...     return cls
... 
>>> @inputize
... class foo(object):
...     pass
... 
>>> foo.input
'sbb'
>>> 

答案 4 :(得分:2)

PEP 3155引入了__qualname__,它是在Python 3.3中实现的。

  

对于顶级函数和类,__qualname__属性等于__name__属性。对于嵌套的类,方法和嵌套的函数,__qualname__属性包含指向模块顶层对象的虚线路径。

可以从类或函数的定义中访问它,例如:

class Foo:
    print(__qualname__)

将有效打印Foo。 您将获得标准名称(不包括模块名称),因此您可能希望将其分割为.字符。

但是,无法获得要定义的类的实际句柄。

>>> class Foo:
...     print('Foo' in globals())
... 
False

答案 5 :(得分:1)

import sys

def class_meta(frame):
    class_context = '__module__' in frame.f_locals
    assert class_context, 'Frame is not a class context'

    module_name = frame.f_locals['__module__']
    class_name = frame.f_code.co_name
    return module_name, class_name

def print_class_path():
    print('%s.%s' % class_meta(sys._getframe(1)))

class MyClass(object):
    print_class_path()

答案 6 :(得分:0)

我认为应该是这样的:

    class foo():
        input = get_input(__qualname__)

答案 7 :(得分:0)

@Yuval Adam 使用 @property 回答

class Foo():
    @property
    def name(self):
        return self.__class__.__name__

f = Foo()
f.name  # will give 'Foo'