1

我有一个继承优先级队列的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_Classmy_attr属性开始,它只是不执行__set__函数NonNegativeInt.

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

4

1 回答 1

2

描述符仅适用于新型类(直接或间接继承自 的类object)。__get__对旧式类的描述符方法有一些支持,但这种支持是有限的。

您使用的PriorityQueue类可能不继承自object. 如果这是Queue.PriorityQueue,那么肯定是这种情况,该模块中的类都是老式的。

你打电话的事实PriorityQueue.__init__与此无关。

于 2015-08-06T16:40:15.430 回答