将描述符添加到Python子类

时间:2015-08-06 16:34:39

标签: python inheritance subclass descriptor python-descriptors

我有一个继承优先级队列的python类,我还使用描述符向类添加属性,如下所示:

from Queue import PriorityQueue
class My_Class(PriorityQueue):
    my_attr = NonNegativeInt(0)

    def __init__(self):
        PriorityQueue.__init__(self)

描述符的实现如下:

class NonNegativeInt(object):
  def __init__(self, default):
      self.default = default
      self.data = WeakKeyDictionary()

  def __get__(self, instance, owner):
      return self.data.get(instance, self.default)

  def __set__(self, instance, value):

      if type(value) is not int:
          raise TypeError('Value must be an int')

      if value < 0:
          raise ValueError("Value must be above 0")

       self.data[instance] = value

当我致电My_Class.my_attr = -1时,我没有得到任何例外。但是,如果我将My_Class更改为此,我将获得异常罚款:

class My_Class(object):
    my_attr = NonNegativeInt(0)

    def __init__(self):
        pass

有趣的是,My_Class的第一个实现以my_attr属性开头,它不会执行__set__中的NonNegativeInt函数。

为什么更改超类会改变我的描述符的工作方式?是否与此行有关:PriorityQueue.__init__(self)?我怎样才能给子类赋予我想要的行为?

1 个答案:

答案 0 :(得分:2)

描述符仅适用于新式类(直接或间接从object继承的类)。

支持旧式类的描述符__get__方法,但这种支持是有限的。

您使用的PriorityQueue类可能不会从object继承。如果这是Queue.PriorityQueue class,那肯定是这种情况,那个模块中的类都是旧式的。

您致电PriorityQueue.__init__这一事实与此无关。