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)