我有一个继承优先级队列的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)
?我怎样才能给子类赋予我想要的行为?
答案 0 :(得分:2)
描述符仅适用于新式类(直接或间接从object
继承的类)。
__get__
方法,但这种支持是有限的。
您使用的PriorityQueue
类可能不会从object
继承。如果这是Queue.PriorityQueue
class,那肯定是这种情况,那个模块中的类都是旧式的。
您致电PriorityQueue.__init__
这一事实与此无关。