从类定义中获取类的名称

时间:2017-03-28 23:26:20

标签: python python-3.x class

所以我有我的基类:

class Foo():
    pass

我永远不会实例化这个类 - 我只想将它作为自定义命名空间。我想要的一件事就是它的名字:

>>> Foo.__name__
'Foo'

但我想将界面更改为此,以便没有下划线。从类对象中获取类的名称将会发生很多,所以它应该更清晰:

class Foo:
    def name():
        return Foo.__name__

这很棒!哦,除了我的名字" Foo"硬编码。我不妨让它返回一个字符串。这还不够好,因为我需要继承这种调整:

class Bar(Foo):
   pass

>>> Bar.name()
'Foo'

没有bueno。

基本上,我需要一个返回类名的类函数,它在继承时仍然可以工作。我无法使用自我,因为我没有制作实例。有什么能达到类似的效果吗?函数是否知道调用它们的命名空间?如果我真的需要使用我想要的对象,但为了我的目的,这将比简单的类层次结构更加丑陋。

编辑:我不相信这个问题与它所关联的问题是一样的。提供给另一个问题的解决方案 - 主要是调用.__ class__属性 - 不能作为这个问题的答案,因为在我的例子中我明确地避免实例化对象。此外,这里提供的最佳答案(使用@classmethod装饰器将类对象作为" self" -esque arg)在链接的替代方案中无处可见。此外,我相信我的问题要比其声称的副本更清晰,更基本的方式构建。选择的答案也是如此。

1 个答案:

答案 0 :(得分:4)

只需使用@classmethod创建一个类方法,然后返回传入的类的名称:

class Foo:
    @classmethod
    def name(cls):
        return cls.__name__

class Bar(Foo): pass

这会在每种情况下返回正确的名称:

>>> Foo.name()
'Foo'
>>> Bar.name()
'Bar'