You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:35:19