Python格式并验证类变量而不实例化它

时间:2016-05-08 21:45:25

标签: python class metaprogramming abc

我正在尝试验证和格式化类变量。该类扩展了一个以ABCMeta__metaclass__的类,我还无法实例化我的子类。因此,当我在下面的代码中运行时,它会打印属性对象而不是 我想要的输出,我理解为什么。但那我该怎么做呢?

from abc import ABCMeta, abstractproperty

class RuleBase(object):
    __metaclass__ = ABCMeta

    id = None
    id = abstractproperty(id)

    @property
    def format_id(self):
        try:
            _id = 'R%02d' % self.id
        except TypeError:
            raise TypeError("ID must be an integer")
        return _id

    @classmethod
    def verbose(cls):
        print cls.format_id

class Rule(RuleBase):
    id = 1

Rule.verbose()  # prints property object and not R01

在我的理论中,我认为这会奏效。

class FormattingABCMeta(ABCMeta):
    def __new__(mcl, classname, bases, dictionary):
        # Format here, remove format_id property from RuleBase, 
        # and use FormattingABCMeta as metaclass for RuleBase.
        return super(C, mcl).__new__(mcl, classname, bases, dictionary)

然而我觉得我太过扭曲了。那么,怎么做呢?我的理解是否正确?任何帮助 非常感谢。

1 个答案:

答案 0 :(得分:2)

不完全确定您的目标是什么,但您需要在传递cls的属性对象上使用 fget 来获取 _id

bigint