【发布时间】:2015-08-06 16:34:38
【问题描述】:
我有一个继承优先级队列的 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 属性开头,它只是不执行NonNegativeInt 中的__set__ 函数。
为什么改变超类会改变我的描述符的工作方式?是否与这条线有关:PriorityQueue.__init__(self)?我怎样才能给子类我想要的行为?
【问题讨论】:
-
你的意思是你继承自
object(小写),并且你在My_Class的instance上设置属性,对吧? -
那么
PriorityQueue从何而来? -
是的,我继承自
object,这只是一个错字。 -
PriorityQueue来自Queue,又一个错字
标签: python inheritance subclass descriptor python-descriptors