【问题标题】:In python which method has to be overridden to validate the class variables [duplicate]在python中,必须重写哪个方法来验证类变量[重复]
【发布时间】:2016-10-10 16:14:09
【问题描述】:

假设我有以下“演示”类:

class demo(object):
   class_variable = None

现在每当有人设置“class_variable”时,我都需要验证该值(例如,class_variable 只能具有“str”类型的值)。

demo.class_variable = 15
# here int value is assigned, i want to raise exception for such cases

这可以通过覆盖 setattr(self,f,v) 方法来为实例变量完成。

类变量怎么办?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

通过在类demo 的元类上定义适当的__setattr__。举个例子:

创建一个 MetaClass,在其 __setattr__ 方法中定义逻辑(可能希望根据属性的 name 执行检查:

class DemoMeta(type):
    def __setattr__(self, name, value):
        if isinstance(value, str):
            return super(DemoMeta, self).__setattr__(name, value)
        else:
            raise ValueError("Only str values allowed")

定义一个使用这个元类的类:

class demo(object):
    __metaclass__ = DemoMeta
    class_variable = None

现在,当您尝试为class_variable 分配一个不是字符串实例的值时,DemoMeta.__setattr__ 将被调用,检查并验证分配。

demo.class_variable = 12

加注:

ValueError: Only str values allowed

【讨论】:

  • 如何在 python 3 中实现这一点?复制上述内容不会引发 ValueError。
  • @juanpa.arrivillaga 将demo 类从class demo(object): ... 更改为class demo(metaclass=MetaDemo): ... 并删除__metaclass__,因为它没有任何区别。
猜你喜欢
  • 1970-01-01
  • 2013-03-04
  • 2013-06-28
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多