Answers:
obj.__class__.__name__
将获得任何对象名称,因此您可以执行以下操作:
class Clazz():
def getName(self):
return self.__class__.__name__
用法:
>>> c = Clazz()
>>> c.getName()
'Clazz'
getName
从子类调用时,它将输出子类名称。如果您真的想要您正在使用的类,那么它将变得很棘手。
getName
从父类调用时,它将输出子类名称?可以指出这一点。
getName()
方法恰好在超类中定义,也要返回实际的运行时子类名称)是正确的。
在类的主体内,类名尚未定义,因此不可用。您不能简单地输入班级名称吗?也许您需要更多地谈论该问题,以便我们为您找到解决方案。
我将创建一个元类来为您完成这项工作。它是在类创建时调用的(概念上是在类的最后:块),并且可以操纵正在创建的类。我还没有测试过:
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'
MyType
在super
行InputAssigningMetaclass
指什么?
引入了PEP 3155__qualname__
,它是在Python 3.3中实现的。
对于顶级函数和类,该
__qualname__
属性等于该__name__
属性。对于嵌套类,方法和嵌套函数,该__qualname__
属性包含一个虚线路径,该虚线路径从模块顶层通向该对象。
可从类或函数的定义中访问它,例如:
class Foo:
print(__qualname__)
将有效打印Foo
。您将获得全限定名称(不包括模块名称),因此您可能希望将其拆分到.
字符。
但是,无法获得要定义的类的实际句柄。
>>> class Foo:
... print('Foo' in globals())
...
False
编辑:是的,您可以;但您必须作弊:调用堆栈中存在当前正在运行的类名,并且该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'
>>>
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()