【问题标题】:Python object returning integer/float on object referencePython对象在对象引用上返回整数/浮点数
【发布时间】:2018-07-01 13:59:21
【问题描述】:

我有这样的课:

class NumberGenerator(object):
    def __init__(self, seed=0):
       random.seed(seed)
       self.current = random.random()

    def __next__(self):
        self.next()

    def next(self):
        self.current = random.random()
        return self.current

理想情况下,如果可以的话,我想通过一些神奇的方法来做以下事情。

>>> numGen = NumberGenerator(99)
>>> numGen.next()
0.15
>>> numGen + 2
2.15

我知道__str____repr____add__ 等。但我想要的是一种神奇的方法,它可以在引用对象时返回一些东西,而不是指向对象的指针。我保证不会将另一个变量分配给下游的对象引用。这在 Python 中可用吗?

【问题讨论】:

  • “但我想要的是一种神奇的方法,它可以在引用对象时返回一些东西,而不是指向对象的指针。”不返回任何指针。 Python没有指针。从根本上说,你不能这样做。 some_var 始终是对对象的引用。
  • 出于您的目的,您可能可以通过重载 + 运算符来摆脱困境。您必须覆盖 __add__
  • @juanpa.arrivillaga 好的,如果这个引用不是指向对象的指针,那它是如何在 Python 中实现的?
  • @neo4k 实现细节无关紧要,Python 中没有指针。最好坚持语言的语义,除非您真的对特定实现的实现细节感兴趣。
  • @neo4k 注意短语“under the hood”。该声明只是说实现 Python 的 C 代码使用指针。这并不意味着 Python 语言本身有指针,只是 Python 实现的语言 - C - 有指针。

标签: python oop object reference


【解决方案1】:

Python 语言不包含指针。您可以将 Python 中的变量视为对某个对象的引用。使用变量时,您正在访问变量所引用的 object

您希望NumberGenerator 类具有的行为可以通过实现__add__ 魔术方法来实现。这是当 + 运算符与表达式左侧的类实例一起使用时 Python 调用的方法。换句话说:

numGen + 2

翻译成:

numGen.__add__(2) 

请注意,如果您想使用+ 运算符而不管您的类实例在表达式的哪一侧,您还需要实现__radd__ 魔术方法:

class NumberGenerator(object):
    def __init__(self, seed=0):
       random.seed(seed)
       self.current = random.random()

    def __next__(self):
        self.next()

    def next(self):
        self.current = random.random()
        return self.current

    def __add__(self, value):
        return self.current + value

    def __radd__(self, value):
        return self.__add__(value)

这是一个正在使用的类的示例:

>>> numGen = NumberGenerator(99)
>>> numGen.next()
0.20007544457494542
>>> numGen + 2
2.2000754445749453
>>> 2 + numGen
2.2000754445749453
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2017-07-11
    • 1970-01-01
    • 2018-09-16
    • 2021-07-20
    • 1970-01-01
    • 2011-12-29
    • 2021-12-05
    相关资源
    最近更新 更多