我有一个继承优先级队列的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)
?我怎样才能给子类我想要的行为?