Learn Special Methods by Building a Vector Space - Step 52

告诉我们发生了什么:

def __mul__(self, other):
    if isinstance(other, (int, float)):
        kwargs = {i: getattr(self, i) * other for i in vars(self)}
        return self.__class__(**kwargs)
    else:
        return NotImplemented

Your method should return a new instance of the current class only when the type of other is either int or float.

到目前为止你的代码

class R2Vector:
    def __init__(self, *, x, y):
        self.x = x
        self.y = y

    def norm(self):
        return sum(val**2 for val in vars(self).values())**0.5

    def __str__(self):
        return str(tuple(getattr(self, i) for i in vars(self)))

    def __repr__(self):
        arg_list = [f'{key}={val}' for key, val in vars(self).items()]
        args = ', '.join(arg_list)
        return f'{self.__class__.__name__}({args})'

    def __add__(self, other):
        if type(self) != type(other):
            return NotImplemented
        kwargs = {i: getattr(self, i) + getattr(other, i) for i in vars(self)}
        return self.__class__(**kwargs)

    def __sub__(self, other):
        if type(self) != type(other):
            return NotImplemented
        kwargs = {i: getattr(self, i) - getattr(other, i) for i in vars(self)}
        return self.__class__(**kwargs)

# User Editable Region

    def __mul__(self, other):
        if isinstance(other, (int, float)):
            kwargs = {i: getattr(self, i) * other for i in vars(self)}
            return self.__class__(**kwargs)
        else:
            return NotImplemented

# User Editable Region

class R3Vector(R2Vector):
    def __init__(self, *, x, y, z):
        super().__init__(x=x, y=y)
        self.z = z

v1 = R2Vector(x=2, y=3)
v2 = R2Vector(x=0.5, y=1.25)
print(f'v1 = {v1}')
print(f'v2 = {v2}')
v3 = v1 + v2
print(f'v1 + v2 = {v3}')
v4 = v1 - v2
print(f'v1 - v2 = {v4}')

你的浏览器信息:

用户代理是: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15

挑战信息:

Learn Special Methods by Building a Vector Space - Step 52

what is your problem, or error info ?

Step 52

Vectors can be multiplied by a scalar, i.e. a number that multiplies each single component. The result of scalar multiplication is a vector with the same orientation as the original vector but a different magnitude.
Implement the scalar multiplication by checking if other is either an int or a float. If it is, return a new instance of the current class that has each component of the starting vector multiplied by other. This will be the vector resulting from the scalar multiplication.
Make sure the methods can be applied to compute the scalar multiplication of vectors with any number of dimensions.

I need to write the mul method. This is the error message: Your method should return a new instance of the current class only when the type of other is either int or float. I don’t understand where I went wrong.

it is my code

    def __mul__(self, other):
        if type(other) in (int, float):
            ....

you can read python doc to get more info.

use type , not isinstance

3 Likes

I found what the issue is. You should remove the else clause because it’s not required for this step.

   else:
       return NotImplemented

Everything else is fine.