前言
每个学过python的人都会对这些原生数据结构有一定的了解。 python底层为我们提供了多种原生的数据结构,比如list、set、dict等,同样的,原生数据结构定义的基本方法也是大家都很熟悉的,比如:len()、str( )、int()等。当然还有我们最熟悉的比较运算符,如=、==、=等。还有算术运算符、容器操作等。
魔术方法
现在我告诉你,其实上面的原生数据结构、运算符、运算符都是可以自定义的,而且非常简单。在一些有趣的源代码中,为了程序设计的方便,使用了一些自定义的数据结构。如果你有阅读python源码的习惯,你也会遇到一些奇怪的函数定义,但实际的调用方法都是常用的native方法。
举个例子
场景
在开发过程中,我们发现set()数据结构混乱。即不同时刻遍历set()中的数据会输出不同的结果。
s={'a', 'b', 'c'}打印
第一个输出:{'c', 'b', 'a'} 第二个输出:{'a', 'b', 'c'} 第三个输出:{'c', 'a', 'b' }
需求
这里要求设计一个像set()这样的数据结构,但是必须是有序的。
实现
首先设计一个类,这里我们使用list()来实现。分别实现了三个功能:添加元素、删除元素、排序元素。
class SetOrder(object): def __init__(self, value=None) - None: self._value=list() 如果value 不是None: 如果isinstance(value, list) 或isinstance(value, set): 对于value: self 中的项目。 push(item) self.order() #添加元素def push(self, item): if item not in self._value: self._value.append(item) #删除元素def pop(self, item): if item in self ._value: self._value.remove(item) # 对元素进行排序def order(self, reverse=False): self._value.sort(reverse=revers
对象set_order初始化后,调用原生str()。
s={'a', 'b', 'c'}set_order=SetOrder(s)print(str(set_order)) # 调用str()函数
输出结果:
__main__.SetOrder 对象位于0x000002B86A788710
显然,这不是我们想要的结果。我们想要的是输出集合中的所有元素,而不是它的内存地址。那么,我们该怎么办?就用python的神奇方法,那就是函数重载。类的代码修改如下:
class SetOrder(object): # 定义str()调用时的行为def __str__(self): return ','.join([str(i) for i in self._value])
再次调用str()函数
s={'a', 'b', 'c'}set_order=SetOrder(s)print(str(set_order)) # 调用str()函数
输出结果:
甲、乙、丙
同样的方式,我们重载len()、in或not in以及比较运算符==。
class SetOrder(object): # 定义len() 调用时的行为def __len__(self): return len(self._value) # 定义使用成员测试操作符时(in 或not in)的行为def __contains__(self, item): return item in self._value # 比较运算符==def __eq__(self, other): if len(self) !=len(other): return False for item in self. _value: 如果项目不在other: 中则返回False 返回
接下来我们来一一验证一下魔术方法的调用。
创建两个新的有序集合()并输出str()
print('创建两个有序集合(): set_order、顺序并初始化:')set_order=SetOrder({'a', 'b', 'c'})print(str(set_order))other=SetOrder( [' a'、'b'、'c'、'd'、'a'])print(str(其他))
str() 的输出:
创建两个新的有序集合(): set_order、order、并初始化:a, b, ca, b, c, d
测试比较运算符
print('比较运算符')print('set_order==other:', set_order==other)other.pop('d')print('set_order==other:', set_order==other)
比较运算符的输出:
比较运算符set_order==other: Falseset_order==other: True
测试in 和not in 运算符
print('在且不在运算符中')print('d 存在: ', 'd' 在其他中)print('d 存在: ', 'd' 不在其他中)
in 和not in 运算符的输出
in 和not in 运算符d 是否存在:False 是否存在:True
Python中的所有魔法方法在官方文档中都有描述,但官方的描述却很模糊。如果没有简单明了的例子,新人很难理解。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/3914.html
用户评论
哇,Python的神奇方法太厉害了!原来可以这么写代码,感觉简洁了不少。
有17位网友表示赞同!
终于搞懂Python的神奇方法了,之前一直觉得很神秘,现在感觉思路清晰多了。
有8位网友表示赞同!
看完文章,感觉Python的神奇方法简直是编程利器,可以大大提高代码的可读性。
有18位网友表示赞同!
Python的神奇方法真的太神奇了,让我对这门语言有了更深层的理解。
有18位网友表示赞同!
Python的神奇方法,简直是编程黑科技!强烈推荐给大家。
有7位网友表示赞同!
原来Python还有这么强大的功能,神奇方法真是太实用了!
有5位网友表示赞同!
这篇文章让我对Python的神奇方法有了全新的认识,感觉受益匪浅。
有10位网友表示赞同!
Python的神奇方法,让我写代码更加优雅,代码质量也提升了不少。
有7位网友表示赞同!
感谢分享,Python的神奇方法,让我对Python的理解更加深入。
有20位网友表示赞同!
Python的神奇方法,真的太方便了!以后写代码要多用用。
有16位网友表示赞同!
Python的神奇方法,简直是编程宝典!
有11位网友表示赞同!
这篇文章让我对Python的神奇方法有了更深层的理解,非常棒!
有20位网友表示赞同!
Python的神奇方法,真是太奇妙了!
有9位网友表示赞同!
Python的神奇方法,让我对这门语言有了更深的了解。
有6位网友表示赞同!
看完文章,感觉Python的神奇方法真是太实用了,强烈推荐!
有15位网友表示赞同!
Python的神奇方法,真是太神奇了!
有8位网友表示赞同!
Python的神奇方法,让我对Python的理解更加深入。
有9位网友表示赞同!
这篇文章让我对Python的神奇方法有了全新的认识。
有5位网友表示赞同!
Python的神奇方法,让我写代码更加优雅。
有8位网友表示赞同!
Python的神奇方法,简直是编程利器!
有6位网友表示赞同!