博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中类的魔术方法
阅读量:5903 次
发布时间:2019-06-19

本文共 2033 字,大约阅读时间需要 6 分钟。

目的:学习python中class的magic methods,提高编程效率。

环境:ubuntu 16.4   python 3.5.2

在学习class时一定会接触到它的magic methods,比如常用__init__,形式都是前后有双下划线。除了这个必须的,还有其他有用的方法,下面大概的介绍一下。

运算魔术方法:

__add__ 用作 +

__sub__ 用作 -

__mul__ 用作 *

__truediv__用作/

__floordiv__用作//

__mod__用作%

__pow__用作**

__and__用作&

__xor__用作^

__or__用作|

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class 
SpecialString:
    
def 
__init__(
self
, cont):
        
self
.cont 
= 
cont
         
    
def 
__truediv__(
self
, other):
        
line 
= 
'=' 
* 
len
(other.cont)
        
return 
rn.join([
self
.cont, line, other.cont])
      
spam 
= 
SpecialString(
'spam'
)
hello 
= 
SpecialString(
'Helo world!'
)
print
(spam
/
hello)
 
# 结果
>>>
spam
=
=
=
=
=
=
=
=
=
=
=
=
Hello world!
>>>

x + y 相当于 x.__add__(y), 但是如果x没有__add__方法,且x和y是不同的类,那么就会检查y有没有__radd__,有则表示为y.__radd__(x),没有则出现TypeError,所有的megic methods都有r methods。

比较魔术方法:

__lt__  用作 <

__le__ 用作 <=

__eq__ 用作 ==

__ne__ 用作 !=

__gt__ 用作 >

__ge__ 用作 >=

 如果__ne__不存在,则返回__eq__的方向。

举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class 
SpecialString:
    
def 
__init__(
self
, cont):
        
self
.cont 
= 
cont
         
    
def 
__gt__(
self
, other):
        
for 
index 
in 
range
(
len
(other.cont) 
+ 
1
):
            
result 
= 
other.cont[:index] 
+ 
'>' 
+ 
self
.cont
            
result 
+
= 
'>' 
+ 
other.cont[index:]
            
print
(result)
         
spam 
= 
SpecialString(
'spam'
)
eggs 
= 
SpecialString(
'eggs'
)
spam > eggs
 
 
# result
 
>>>
>spam>eggs
e>spam>ggs
eg>spam>gs
egg>spam>s
eggs>spam
>>>

类似容器的魔术方法:

 __len__用作 len()

 __getitem__ 用作进行索引

 __setitem__ 用作分配索引

 __delitem__ 用作删除索引

 __iter__ 用作迭代对象

 __contains__用作in

 举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class 
VagueList:
    
def 
__init__(
self
, cont):
        
self
.cont 
= 
cont
         
    
def 
__getitem__(
self
, index):
        
return 
self
.cont[index 
+ 
random.randint(
-
1
1
)]
     
    
def 
__len__(
self
):
        
return 
random.randint(
0
len
(
self
.cont) 
* 
2
)
         
vague_list 
= 
VagueList([
'A'
'B'
'C'
'D'
'E'
])
print
(
len
(vague_list))
print
(
len
(vague_list))
print
(vague_list[
2
])
print
(vague_list[
2
])
 
 
#result
>>>
2
2
C
D
>>>

  参考文档来源:sololearn

本文转自RickyHuL51CTO博客,原文链接:http://blog.51cto.com/rickyh/1952167 ,如需转载请自行联系原作者
你可能感兴趣的文章
linux文件权限控制
查看>>
关于UISlider的拖动手势不灵敏的解决方法(转)
查看>>
我要做 Android 之网络相关知识点
查看>>
使用Maven Helper解决Maven插件冲突
查看>>
SpringBoot应用属性的设置途径及优先级
查看>>
JUnit4教程+实践
查看>>
Selenium实战教程系列(二)---元素定位
查看>>
使用解构的几个骚操作
查看>>
Python入门学习指南--内附学习框架
查看>>
自用素材(一) 在React中封装cookie
查看>>
全排列的理解2
查看>>
Axios异步封装新方案 Class + Async/await
查看>>
 http代理ip选择的重点
查看>>
Makefile伪目标、多目标、静态模式与变量基础用法
查看>>
元精柱龙膏多少钱一盒?元精柱龙膏怎么使用?【内部多少钱一盒】
查看>>
面试官:说说你知道的几种负载均衡分类
查看>>
iOS版应用支持IPV6,就那点事儿
查看>>
2019年移动开发,我的改变之旅
查看>>
华为海思回应「极限生存的假设成为现实」
查看>>
【我读《Big Data》】序言部分--拥抱“大数据时代”
查看>>