python 如何使类返回值?

rdrgkggo  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(160)

请看下面的例子:

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

vec = Vector(10, 4, 2)
print(vec) # <__main__.Vector object at 0x0000027BECAAFEE0>
print(vec.magnitude) # 10.954451150103322
print(vec.direction) # [0.91287093 0.36514837 0.18257419]

当我尝试print(vec)时,它返回分配的内存地址,而不是数组which should be [10, 4, 2]的值。
注意:我不想使用__repr__,因为那样的话我会得到一个字符串,而我需要返回实际的类型。上面的只是一个小例子。

iyr7buue

iyr7buue1#

如果希望在将类发送给print函数时打印特定内容,则需要重载__str____repr__函数:

def __str__(self):
    return str(self._vector)

def __repr__(self):
    return str(self._vector)

因为print只接收发送给它的字符串表示并将其打印到屏幕上,所以需要使用其中的一个函数,如果您正在寻找一个函数,它将self._vector作为一个对象返回,然后您可以打印它,那么您应该编写一个函数来完成此操作:

@property
def value(self):
    return tuple(self._vector)

阅读了评论之后,似乎你真正想要的是算术修改self._vector的能力,你可以通过重载__add____sub____mul____div__来实现:

def __add__(self, other):
    result = self._vector + other._vector
    return Vector(result[0], result[1], result[2])

def __sub__(self, other):
    result = self._vector - other._vector
    return Vector(result[0], result[1], result[2])

def __mul__(self, other):
    result = self._vector * other
    return Vector(result[0], result[1], result[2])

def __div__(self, other):
    result = self._vector / other
    return Vector(result[0], result[1], result[2])

实施这些将允许您执行以下操作:

a = Vector(1, 2, 3)
b = Vector(4, 5, 6)
a + b   # [5, 7, 9]
b - a   # [3, 3, 3]
2 * a   # [2, 4, 6]
a / 2   # [0.5, 1, 1.5]
hgtggwj0

hgtggwj02#

既然你不想使用__repr__,你可以使用getter属性来返回值,就像你使用property来返回大小和方向一样。
您的代码应如下所示

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 vector(self) -> np.ndarray:
        return self._vector
      
    @property
    def magnitude(self) -> float:
        return self._magnitude

    @property
    def direction(self) -> np.ndarray:
        return self._direction

vec = Vector(10, 4, 2)
print(vec.vector) # [10 4 2]
print(vec.magnitude) # 10.954451150103322
print(vec.direction) # [0.91287093 0.36514837 0.18257419]

相关问题