可以在类之外重写魔术方法吗? 当我做这样的事情时
def __int__(x):
return x + 5
a = 5
print(int(a))
它打印“5”而不是“10”。我是否做错了什么或者魔法方法不能在类之外被覆盖?
最佳答案
简短回答;并非如此。
您不能任意更改 int()
内置函数(*内部调用 __int__()
)对任意内置类型(例如 int<)的行为
(s)。
但是,您可以更改自定义对象的行为,如下所示:
示例:
class Foo(object):
def __init__(self, value):
self.value = value
def __add__(self, other):
self.value += other
def __repr__(self):
return "<Foo(value={0:d})>".format(self.value)
演示:
>>> x = Foo(5)
>>> x + 5
>>> x
<Foo(value=10)>
这会覆盖这里的两件事并实现两个特殊方法:
__repr__()
由repr()
调用__add__()
由+
运算符调用。
更新:根据上面的评论;从技术上讲,您可以重新定义内置函数int
;示例:
def int(x):
return x + 5
int(5) # returns 10
但是不建议这样做,并且不会改变对象x
的整体行为。
更新 #2: 无法更改 bultin 类型行为的原因(不修改底层源或使用 Cuthon 或 ctypes )是因为内置与 Homoiconic Languages 不同,Python 中的类型不会向用户公开或可变。 (参见:Homoiconicity)。 -- 即使如此,我也不确定你可以使用 Cython/ctypes;但原因问题是“你为什么要这样做?”
更新#3:请参阅有关 Data Model 的 Python 文档(object.__complex__
例如)。
关于python - 重写内置类型的特殊方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159529/