Python 链式调用中,为什么每次调用__getattr__都会创建新的实例?
pyhton类的内存分配问题:链式调用
在使用__getattr__魔术方法实现链式调用时,每次调用返回的chain实例的id会不同。这是因为每当调用__getattr__时,都会创建一个新的chain实例。
原因分析
在提供的代码示例中,__getattr__方法中的代码会创建一个新的chain实例,并将传给path参数的新路径作为它的_path属性。每次调用返回的都是一个不同的chain实例,因此其id也随之改变。
立即学习“Python免费学习笔记(深入)”;
解决方法
要解决这个问题,需要修改__getattr__方法中创建实例的方式,使其返回当前实例而不是创建新的实例。修改后的代码如下:
def __getattr__(self, path): self._path = '%s/%s' % (self._path, path) return self
通过这种修改,__getattr__方法将不会创建新的chain实例,而是返回当前实例。这样,每次调用将返回相同的chain实例,并且其id也会保持不变。
文章推荐
-
使用内置函数的Python程序来反转数组的元素
数组是一种数据结构,用于按顺序存储同质元素。存储的元素由索引值或键来标识。 Python 没有特定的数据结构来表示数组。...
Python
17秒前 0 -
Python程序检测链表中的循环
当链表中的任何节点不指向 null 时,就称链表存在循环。最后一个节点将指向链表中的前一个节点,从而创建一个循环。有环的...
Python
59秒前 0 -
在Python中,两个字典键的乘积
简介Python 中两个字典的乘积涉及遍历字典。我们可以找出满足特定条件的特定键。然后就可以很容易地计算出乘积。 Pyt...
Python
2分钟前 0 -
如何使用OpenCV Python创建一张黑色图像和一张白色图像?
要创建黑色图像,我们可以使用np.zeros()方法。它创建一个给定大小的 numpy n 维数组,所有元素均为 0。由...
Python
2分钟前 0 -
Python和Anaconda之间有什么区别?
在本文中,我们将了解 Python 和 Anaconda 之间的差异。Python是什么?Python 是一种开源语言,...
Python
3分钟前 0
最新文章
- 使用内置函数的Python程序来反转数组的元素 17秒前
- Python程序检测链表中的循环 59秒前
- 在Python中,两个字典键的乘积 2分钟前
- 如何使用OpenCV Python创建一张黑色图像和一张白色图像? 2分钟前
- Python和Anaconda之间有什么区别? 3分钟前
- Python - 检查字符串中的所有字符是否都是字母数字? 4分钟前
- 高级Python元编程:动态代码生成和反射 4分钟前
- 如何在Python中实现梯度下降算法以寻找局部最小值? 6分钟前
- Python程序删除数组中的重复元素 7分钟前
- 使用Networxx模块的超链接诱导主题搜索(HITS)算法- Python 7分钟前