patrickcui 发表于 2023-1-4 21:25:42

关于魔法方法的不解之处

我们知道魔法方法有__init__()用于初始化、__new__()用于定义不可改变的类型,这两个倒是不太难理解重载它们的意义。但是像算术运算:__add__(self,other)、__sub__(self,other)、__mul__(self,other)、__truediv__(self,other)。打印:__str__(self)、__repr__(self),属性操作:__getattr__(self, name)、__getattribute__(self, name)、__setattr__(self, name, value)、__delattr__(self, name)。描述符:__get__(self, instance, owner)、__set__(self, instance, value)、__delete__(self, instance)。定制序列:__len__(self)、__getitem__(self, key)、__setitem__(self, key, value)、__delitem__(self, key)。以及迭代器:__iter__(self)、__next__(self)。为什么要重载?重载的具体作用是什么?重载的意义又是什么?说实话我到现在也没弄明白。有没有哪位大佬告诉我一些实际的例子?非要重载这些魔法方法不可的例子

jackz007 发表于 2023-1-4 22:39:38

本帖最后由 jackz007 于 2023-1-4 22:42 编辑

          好奇葩的要求,非重载不可???要知道,别人只是给你留下了一个干预和改变特定操作行为结果的途径,你既可以使用,也可以不用,谁也不会强制你必须使用或不使用。

阿奇_o 发表于 2023-1-4 22:46:04

哈哈,在我看来,__new__和__init__ 恰恰是比较难理解的,因为它涉及“对象是怎么诞生的”这一基本问题。 第二则是“属性操作”,“实例”(对象)有了,你具体怎么使用它所包含的属性(包括方法)呢?遵循怎样的机制呢?等等,就是这类特殊方法所定义的(你不定义它,即不“重载”它,它就默认用object或其他父类的这些方法)。。这个具体细节可以很复杂,也比较少用。。
“描述符”相对会用多些,你正确地定义了它(重载它),它就会按你的逻辑来做事。常常用在:实现 动态查找,属性托管等需求场景。
其他几类特殊方法比较好理解,自己查查,自己动手试试,就明白了。。(手机打字,我就懒得说了。。)

阿奇_o 发表于 2023-1-4 22:49:22

哦哦,我跟着掉坑了吧——不是“重载”overload,是“重写”overwrite!
页: [1]
查看完整版本: 关于魔法方法的不解之处