gpt4 book ai didi

python - 向 Python 子类添加描述符

转载 作者:行者123 更新时间:2023-12-01 04:34:58 25 4
gpt4 key购买 nike

我有一个继承优先级队列的 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__函数非负整数

为什么更改父类(super class)会改变我的描述符的工作方式?它与这一行有关吗:PriorityQueue.__init__(self)?我怎样才能给子类我想要的行为?

最佳答案

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

您使用的PriorityQueue类可能不是从object继承的。如果这是Queue.PriorityQueue class那么情况确实如此,该模块中的类都是旧式的。

您调用 PriorityQueue.__init__ 的事实与此无关。

关于python - 向 Python 子类添加描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com