如何让Python类实例返回实际值而非内存地址?
解决Python类实例返回实际值而非内存地址的问题
方案1:实现__str__方法(满足print显示数组内容)
如果你只是希望print(vec)时显示数组的实际内容而非内存地址,可以实现__str__方法——它返回对象的友好字符串表示,输出效果和直接打印数组一致:
import numpy as np class Vector: def __init__(self, x, y, z): self._vector = np.array([x, y, z]) self._magnitude = np.linalg.norm(self._vector) self._direction = self._vector/self._magnitude @property def magnitude(self) -> float: return self._magnitude @property def direction(self) -> np.ndarray: return self._direction def __str__(self): return str(self._vector) vec = Vector(10, 4, 2) print(vec) # 输出 [10 4 2]
方案2:让实例可隐式转换为numpy数组(满足"实际类型"需求)
如果需要实例本身能像numpy数组一样参与运算、被当作数组类型处理,可以实现__array__方法,配合__str__兼顾print显示效果:
import numpy as np class Vector: def __init__(self, x, y, z): self._vector = np.array([x, y, z]) self._magnitude = np.linalg.norm(self._vector) self._direction = self._vector/self._magnitude @property def magnitude(self) -> float: return self._magnitude @property def direction(self) -> np.ndarray: return self._direction def __str__(self): return str(self._vector) def __array__(self): return self._vector vec = Vector(10, 4, 2) print(vec) # 输出 [10 4 2] # 可直接参与numpy运算 result = vec + np.array([1, 1, 1]) print(result) # 输出 [11 5 3] print(type(result)) # 输出 <class 'numpy.ndarray'>
方案3:继承numpy.ndarray(彻底让实例成为数组类型)
如果希望Vector类本身就是numpy数组的子类,实例完全具备数组的所有特性,同时保留自定义属性和方法:
import numpy as np class Vector(np.ndarray): def __new__(cls, x, y, z): # 创建numpy数组实例并转为子类对象 obj = np.array([x, y, z]).view(cls) # 添加自定义属性 obj._magnitude = np.linalg.norm(obj) obj._direction = obj/obj._magnitude return obj @property def magnitude(self) -> float: return self._magnitude @property def direction(self) -> np.ndarray: return self._direction vec = Vector(10, 4, 2) print(vec) # 输出 [10 4 2] print(type(vec)) # 输出 <class '__main__.Vector'>(同时是numpy数组子类) # 直接执行数组运算 print(vec * 2) # 输出 [20 8 4]
方案说明
- 方案1仅解决print显示问题,实例仍为自定义类型;
- 方案2让实例可转换为数组,同时保留自定义属性和方法;
- 方案3让实例本质是数组子类,完全兼容numpy操作,最贴近"返回实际类型"的需求。
内容的提问来源于stack exchange,提问作者mauro
相关产品推荐
相关产品推荐

