Tob*_*ler 2 python class rounding python-2.7
给出一个简单的类
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]
Run Code Online (Sandbox Code Playgroud)
为什么在抱怨而不是期望的情况下abs(Vector([-3,4]))正确屈服,这又如何解决?5round(Vector([-3.1,4]))TypeError: a float is required[-3,4]
我知道round通常应该返回一个浮点数,但对于这个例子中的向量,可能的意义可能没有歧义,为什么这不能简单地被覆盖?我真的必须继承numbers.Real或定义Vector(...).round(n)吗?
该__round__特殊的方法只在Python 3引入有用于在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]
Run Code Online (Sandbox Code Playgroud)
或者您必须提供自己的round()功能:
import __builtin__
def round(number, digits=0):
try:
return number.__round__(digits)
except AttributeError:
return __builtin__.round(number, digits)
Run Code Online (Sandbox Code Playgroud)
您甚至可以将其修补到__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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |