python - 重写内置类型的特殊方法

标签 python

可以在类之外重写魔术方法吗? 当我做这样的事情时

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 类型行为的原因(不修改底层源或使用 Cuthonctypes )是因为内置与 Homoiconic Languages 不同,Python 中的类型不会向用户公开或可变。 (参见:Homoiconicity)。 -- 即使如此,我也不确定你可以使用 Cython/ctypes;但原因问题是“你为什么要这样做?”

更新#3:请参阅有关 Data Model 的 Python 文档(object.__complex__ 例如)。

关于python - 重写内置类型的特殊方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159529/

相关文章:

python - 从一维列表创建列表列表,按长度对每个元素进行分组

Python 列表迭代问题

python - 如何使用 NLTK 搭配获取 trigrams 的 PMI 分数? Python

Python:使用for循环比较列表中的项目

python - 如何从 Python 脚本执行 Cassandra CLI 命令?

从具有后缀的字符串中解析数字的 Pythonic 方法

python - 如何修复 bs4 选择错误 : 'TypeError: __init__() keywords must be strings'

python - 如何在 Selenium 中保存浏览器 session ?

python - 使用 python 将外部文件中的数据保存到列表中

python - 在 Python Flask 中,如何获取当前登录用户的角色名称?