获取当前课程的名称?

Jon*_*urg 92 python class

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

例:

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

class foo():
    input = get_input([class name goes here])
Run Code Online (Sandbox Code Playgroud)

由于程序的性质,我正在与(vistrails)接口,我不能__init__()用来初始化input.

Yuv*_*dam 142

obj.__class__.__name__ 会得到任何对象名称,所以你可以这样做:

class Clazz():
    def getName(self):
        return self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

用法:

>>> c = Clazz()
>>> c.getName()
'Clazz'
Run Code Online (Sandbox Code Playgroud)

  • @KomodoDave,因为这是错误的,即使在方法范围内也是如此.从子类调用`getName`时,它将输出子类名.如果你真的想要你正在使用的课程,它会变得棘手. (4认同)
  • 在OO术语中,解决方案(即使`getName()`方法恰好在超类中定义,也返回实际的运行时子类名称)是正确的. (4认同)

Ned*_*der 21

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

我会创建一个元类来为你完成这项工作.它在类创建时调用(概念上在类的最后: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'
Run Code Online (Sandbox Code Playgroud)

  • “InputAssigningMetaclass”中“super”行中的“MyType”指的是什么? (2认同)

mde*_*ous 15

您可以通过类的私有属性访问它:

cls_name = self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

编辑:

如上所述Ned Batcheler,这不会在类体中起作用,但它会在一种方法中起作用.


Sin*_*ion 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'
Run Code Online (Sandbox Code Playgroud)

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

可能最简单的解决方案是使用装饰器,类似于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'
>>> 
Run Code Online (Sandbox Code Playgroud)


Rig*_*leg 6

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

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

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

class Foo:
    print(__qualname__)
Run Code Online (Sandbox Code Playgroud)

将有效打印Foo。您将获得全限定名称(不包括模块名称),因此您可能希望将其拆分到.字符。

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

>>> class Foo:
...     print('Foo' in globals())
... 
False
Run Code Online (Sandbox Code Playgroud)