首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:使用星号(*)将两个对象“相乘”在一起是什么意思?

Python:使用星号(*)将两个对象“相乘”在一起是什么意思?
EN

Stack Overflow用户
提问于 2018-07-12 04:34:09
回答 1查看 815关注 0票数 -1

关于类,我是一个Python新手。我已经看到一些脚本包含似乎将类的实例“乘以”在一起的行。例如:

代码语言:javascript
复制
Z = X * Y

其中X和Y是两个不同类的实例。

*符号是什么意思,以及它如何应用于Python中的类(或类的实例)?

在大多数情况下*与乘法有关,但我不明白“乘法”类是什么意思。

任何信息都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 04:49:20

*运算符的意思是“乘法”。

但两个对象相乘意味着什么,这取决于这些对象的类型。

对于所有的内置和stdlib类型,它意味着乘法,如果它有意义,或者它是一个TypeError,如果没有意义。例如:

代码语言:javascript
复制
>>> 2 * 3
6
>>> (1, 2, 3) * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
>>> "abc" * "def"
TypeError: can't multiply sequence by non-int of type 'str'

因为乘法对于类对象没有意义,所以它是TypeError的一种类型

代码语言:javascript
复制
>>> class C: pass
>>> C * 2
TypeError: unsupported operand type(s) for *: 'type' and 'int'

如果您(或第三方库作者)创建了一个新类型,您可以决定乘法的含义。文档中的Emulating numeric types部分介绍了执行此操作的方法,但简短的版本是定义一个__mul__方法:

代码语言:javascript
复制
class MyNumberyThing:
    def __init__(self, n):
        self.n = n
    def __repr__(self):
        return f'MyNumberyType({self.n})'
    def __mul__(self, other):
        if isinstance(other, MyNumberyThing):
            return MyNumberyThing(self.n * other.n)
        elif isinstance(other, int):
            return MyNumberyThing(self.n * other)
        elif isinstance(other, float):
            raise TypeError("sorry, can't multiply by float because of precision issues")
        else:
            raise TypeError(f"sorry, don't know how to multiply by {type(other).__name__}")

注意,这使得MyNumberyThing的实例是可倍增的。它不会使MyNumberyThing本身变得可乘(MyNumberyThing不是MyNumberyThing,它是type):

代码语言:javascript
复制
>>> n = MyNumberyThing(2)
>>> n * 3
MyNumberyType(6)
>>> MyNumberyThing * 3
TypeError: unsupported operand type(s) for *: 'type' and 'int'

当然,没有什么能阻止你去定义一些荒谬的东西:

代码语言:javascript
复制
class MySillyThing:
    def __mul__(self, other):
        self.storage = -other
        print(f'I took your {other}')

>>> silly = MySillyThing()
>>> silly * 3
I took your 3
>>> silly.storage
-3

…当然,除了没有人会理解你的代码这一事实。(这个“无名之辈”包括你,6个月后,你试图调试一些你认为你已经用…完成的东西)

顺便说一下,Python实际上有两种拼写“multiply”的方法:*@

内置类型都忽略了@,所以如果你尝试使用它,你只会得到一个TypeError。它的作用是,基本上,所以NumPy可以使用*进行元素乘法,使用@进行矩阵乘法。( @操作符的神奇方法甚至被称为__matmul__。)当然,同样需要执行两种不同乘法的其他第三方库也可以将@用于第二种乘法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51293796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档