【问题标题】:Using Python class name to define class variables使用 Python 类名定义类变量
【发布时间】:2018-08-31 04:26:08
【问题描述】:

我有课

class MyClass(object):
    ClassTag = '!' + 'MyClass'

我想使用一些构造来获取类名,而不是显式分配'MyClass'。如果我在一个类函数中,我会做类似的事情

@classfunction
def Foo(cls):
    tag = '!' + cls.__class__.__name__

但这里我在类范围内,但不在任何函数范围内。解决这个问题的正确方法是什么?

非常感谢

【问题讨论】:

  • 先修正你的类定义错字...
  • 谢谢,是在自动思考上从头部输入 :) 不是从代码中输入——输入 def 而不是 class——现在已修复。

标签: python python-2.7 classname


【解决方案1】:

我想使用一些构造来获取类名,而不是显式分配“MyClass”。

您可以使用类装饰器结合类对象的__name__ 属性来完成此操作:

def add_tag(cls):
    cls.ClassTag = cls.__name__
    return cls

@add_tag
class Foo(object):
    pass

print(Foo.ClassTag) # Foo

除了上述之外,还有一些旁注:

  • 从上面的例子可以看出,类是使用 class 关键字,而不是 def 关键字。 def 关键字用于 定义功能。我推荐通过the tutorial provided by Python, 掌握 Python 基础知识。

  • 如果您不是在处理遗留代码或需要 Python 2 库的代码,我强烈推荐 upgrading to Python 3。除了 Python 基金会将在 2020 年停止支持 Python,Python 3 还修复了 Python 2 的许多怪癖,并提供了新的有用功能。如果您正在寻找有关如何从 Python 2 过渡到 3 的更多信息,一个不错的起点是here

【讨论】:

  • @liliscent 美丽的帖子同时具有完全相同的命名内容哈哈。 :p
  • 谢谢,在自动思考中从头部输入 :) 不是从代码中输入——输入 def 而不是 class——现在已修复。非常聪明,谢谢
  • 很高兴我能帮助@gt6989b!
【解决方案2】:

一个简单的方法是写一个装饰器:

def add_tag(cls):
    cls.ClassTag = cls.__name__
    return cls

# test

@add_tag
class MyClass(object):
    pass

print(MyClass.ClassTag)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多