python - 有没有办法在创建类(不是实例)时调用(静态)方法?

标签 python class methods static

再一次,有点惊讶没有找到这个问题的答案......

我提出这个问题的真实原因是: 我在一个类中有一个常量字典

class MySQLConstants():

  DECIMAL = 0
  TINY = 1
  SHORT = 2
  LONG = 3
  FLOAT = 4
  DOUBLE = 5

  ... etc.

我想要一本字典,这样我就可以在给定数字的情况下找到常量……很简单:

fieldTypeDic = {}
for fieldType in dir( MySQLConstants ):
   value = getattr( MySQLConstants, fieldType )
   fieldTypeDic[ value ] = fieldType

...在类定义语句执行后,将其设为 MySQLConstants 的 @static 方法并通过 MySQLConstants.createDic() 调用它就足够容易了...但我只是想知道是否有任何方法获得一个方法,不可避免地@static,在创建一个类(注意我不是谈论创建此类的实例!)时运行...

最佳答案

这是一个使用元类的解决方案:

class ConstantDictMeta(type):
    def __new__(cls, name, bases, dct):
        fieldTypeDic = dict((v, k) for k, v in dct.items() if k.isupper())
        dct["fieldTypeDic"] = fieldTypeDic
        return type.__new__(cls, name, bases, dct)

class MySQLConstants():
    __metaclass__ = ConstantDictMeta
    DECIMAL = 0
    TINY = 1
    SHORT = 2
    LONG = 3
    FLOAT = 4
    DOUBLE = 5

>>> MySQLConstants.fieldTypeDic
{0: 'DECIMAL', 1: 'TINY', 2: 'SHORT', 3: 'LONG', 4: 'FLOAT', 5: 'DOUBLE'}

关于python - 有没有办法在创建类(不是实例)时调用(静态)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826651/

相关文章:

python - 如何使用 "actor.collidepoint(pos)"检查 pygame 中 Actor 之间的碰撞

python - Django 仅从日期时间中过滤并选择日期

python - 在django中连接外键上的对象查询结果

java - 是否可以重载实现接口(interface)的类中的方法?

fragment 中的Android按钮单击方法(崩溃)

java - 如何使我的方法接受 x 个参数

python - 下载文件时 urlretrieve 挂起

c++ - 出现错误 C2679 : binary '+=' : no operator found which takes a right-hand operand of type 'int' 的问题

ruby - 如何检查类是否已定义?

java - 如何在java方法中使用动态代码?