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

Python格式化并验证类变量,而不实例化它,python,class,metaprogramming,abc,Python,Class,Metaprogramming,Abc,我正在尝试验证并格式化一个类变量。该类以ABCMeta作为其\uuuu元类\uuuuu扩展了一个类,我还不能实例化我的子类。所以当我运行下面的代码时,它会打印属性对象,而不是 我想要的输出,我明白为什么。但是我该怎么做呢 from abc import ABCMeta, abstractproperty class RuleBase(object): __metaclass__ = ABCMeta id = None id = abstractproperty(id)

我正在尝试验证并格式化一个类变量。该类以
ABCMeta
作为其
\uuuu元类\uuuuu
扩展了一个类,我还不能实例化我的子类。所以当我运行下面的代码时,它会打印属性对象,而不是 我想要的输出,我明白为什么。但是我该怎么做呢

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)
但是我觉得我把它扭得太厉害了。那么,如何做到这一点呢?我的理解正确吗?有什么帮助吗
非常感谢。

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


属性仅对实例有效,而对类无效。它们只是不受类的约束。由于
verbose
是一种类方法,因此不能使用
cls.format\u id
。您还必须将
format\u id
设置为一个classmethod并调用它。另一种方法是创建一个.Yes。非常感谢。然而,这是最具Python风格的方式吗?还有,我的目标看起来太偏斜了吗?我的意思是我有一些扩展规则库的规则,我想把它们的详细内容打印出来。如果
id
属性始终是一个类属性,那么在不创建实例的情况下这样做是否听起来很奇怪?如果
id
属性始终是一个类属性,则可以这样做。@AnshuKumar,正如Martijn在您的问题下面所评论的,另一个选项是将其作为一个类方法并打印cls.format_id()但是,假设您处理的是类属性,这将很好地工作,从您的问题来看,我假设您是。
 print cls.format_id.fget(cls)