2

给定一个简单的类

class Vector(object):
    def __init__(self, value):
        self.value = value
    def __abs__(self):
        return math.sqrt(sum([x**2 for x in self.value]))
    def __round__(self, *n):
        return [round(x,*n) for x in self.value]

为什么在抱怨 a而不是 desired时abs(Vector([-3,4]))正确 yield ,如何解决?5round(Vector([-3.1,4]))TypeError: a float is required[-3,4]

我知道round通常应该返回一个浮点数,但是对于本例中的向量,可能的含义可能没有歧义,那么为什么不能简单地覆盖它呢?我真的必须继承numbers.Real或定义Vector(...).round(n)吗?

4

1 回答 1

6

特殊方法仅在 Python 3中__round__引入。Python 2 中不支持特殊方法。

您必须使用专用方法而不是函数:

class Vector(object):
    def __init__(self, value):
        self.value = value

    def round(self, n):
        return [round(x, n) for x in self.value]

或者您必须提供自己的round()功能:

import __builtin__

def round(number, digits=0):
    try:
        return number.__round__(digits)
    except AttributeError:
        return __builtin__.round(number, digits)

您甚至可以将其修补到__builtins__命名空间中:

import __builtin__

_bltin_round = __builtin__.round

def round(number, digits=0):
    try:
        hook = number.__round__
    except AttributeError:
        return _bltin_round(number, digits)
    else:
        # Call hook outside the exception handler so an AttributeError 
        # thrown by its implementation is not masked
        return hook(digits)

__builtin__.round = round
于 2013-04-17T11:18:41.830 回答