gpt4 book ai didi

python - 多态性和来自模块的调用

转载 作者:行者123 更新时间:2023-12-05 02:31:03 26 4
gpt4 key购买 nike

我在 python 的面向对象编程中使用多态性时遇到问题。在这里,我定义了列表类的一个特例,它覆盖了 append 和 setitem 方法

class MyList(list):
def __setitem__(self, key,value):
super(MyList,self).__setitem__(key,value)
print("bubu")
def append(self,value):
super(MyList,self).append(value)
print("bibi")

现在如果我用

测试这个类
myobj = MyList()
myobj.append(1)
myobj[0]=3

如预期的那样,我得到了“bibi”,然后是“bubu”。但是如果我将 MyList 对象与外部模块一起使用

import heapq
myobj = MyList()
heapq.heappush(myobj,1)

heapq 中的函数 heappush 应该调用 myobj.append(我检查了来源 https://github.com/python/cpython/blob/3.10/Lib/heapq.py)。但是这次我没有得到“比比”!调用的“追加”不应该是参数中传递的实例的追加吗?

我的比比斯在哪里?? :)

最佳答案

如果您在不带任何参数的情况下运行 Python 并输入以下内容,我敢肯定您不会遇到导入错误:

>>>
>>>
>>> from _heapq import *
>>>

我提到这个是因为如果你更深入地研究 heapq 的源代码,你会在底部看到:

# If available, use C implementation
try:
from _heapq import *
except ImportError:
pass
... # etc.

而且由于我们没有理由相信您的 MyList 方法 append 的实现没有正常工作,所以仅凭这一点就应该表明 heapq.heappush 方法调用列表中的append 方法。现在我们不知道为什么。

更新

在没有_heapq的情况下加载heapq:

import sys
import importlib
import _heapq

# Make _heapq unloadable
del _heapq
sys.modules['_heapq'] = None

# heapq was already loaded with _heapq; get a reference:
heapq = sys.modules['heapq']
# reload heapq, but this time without _heapq:
importlib.reload(heapq)

class MyList(list):
def __setitem__(self, key,value):
super(MyList,self).__setitem__(key,value)
print("bubu")
def append(self,value):
super(MyList,self).append(value)
print("bibi")

myobj = MyList()
heapq.heappush(myobj,1)

打印:

bibi
bubu

有趣的是 'bubu' 和 'bibi' 打印。这是 _siftdown 方法的结果,heappush 最终调用了结果为“bubu”的结果。

关于python - 多态性和来自模块的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71696903/

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