1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<code>一、</code><code>property</code><code>属性高级用法</code>
<code>可以将对象方法作为属性使用</code>
<code>例子:</code>
<code>class</code> <code>Foo:</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, age):</code>
<code> </code><code>) </code><code>self</code><code>.__age </code><code>=</code> <code>age</code>
<code> </code><code>@</code><code>property</code>
<code> </code><code>def</code> <code>age(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code><code>.__age</code>
<code> </code><code>@age.setter</code>
<code> </code><code>def</code> <code>age(</code><code>self</code><code>, args):</code>
<code> </code><code>self</code><code>.__age </code><code>=</code> <code>args</code>
<code> </code><code>@age.deleter</code>
<code> </code><code>del</code> <code>self</code><code>.__age</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>20</code><code>)</code>
<code>print</code><code>(obj.age)</code>
<code>obj.age </code><code>=</code> <code>3</code>
<code>del</code> <code>obj.age</code>
<code> </code><code>self</code><code>.__age </code><code>=</code> <code>age</code>
<code> </code><code>def</code> <code>get_age(</code><code>self</code><code>):</code>
<code> </code><code>def</code> <code>set_age(</code><code>self</code><code>, args):</code>
<code> </code><code>def</code> <code>del_age(</code><code>self</code><code>):</code>
<code> </code><code>age </code><code>=</code> <code>property</code><code>(get_age, set_age, del_age)</code>
<code>__str__方法,默认返回对象内存地址,可以修改重写默认方法</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, name, age):</code>
<code> </code><code>self</code><code>.name </code><code>=</code> <code>name</code>
<code> </code><code>self</code><code>.age </code><code>=</code> <code>age</code>
<code> </code><code>def</code> <code>__str__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>'name: %s, age: %s'</code> <code>%</code><code>(</code><code>self</code><code>.name, </code><code>self</code><code>.age)</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>'egon'</code><code>, </code><code>'18'</code><code>)</code>
<code>print</code><code>(obj)</code>
<code>__getitem__, __setitem__,__delitem__可以通过字典的方式调用属性和方法</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, name):</code>
<code> </code><code>def</code> <code>__getitem__(</code><code>self</code><code>, item):</code>
<code> </code><code>print</code><code>(</code><code>"getitem"</code><code>)</code>
<code> </code><code>return</code> <code>self</code><code>.__dict__[item]</code>
<code> </code><code>def</code> <code>__setitem__(</code><code>self</code><code>, key, value):</code>
<code> </code><code>print</code><code>(</code><code>"setitem"</code><code>, key, value)</code>
<code> </code><code>self</code><code>.__dict__[key] </code><code>=</code> <code>value</code>
<code> </code><code>def</code> <code>__delitem__(</code><code>self</code><code>, key):</code>
<code> </code><code>print</code><code>(</code><code>'del obj[key]时,执行'</code><code>)</code>
<code> </code><code>self</code><code>.__dict__.pop(key)</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>'egon'</code><code>)</code>
<code>print</code><code>(obj.name)</code>
<code>#obj.name = 'alex'</code>
<code>#obj['name'] = 'alex'</code>
<code>print</code><code>(obj[</code><code>'name'</code><code>])</code>
<code>del</code> <code>obj[</code><code>'name'</code><code>]</code>
<code>__call__回掉函数,可以将对象变成可调用的</code>
<code> </code><code>def</code> <code>__call__(</code><code>self</code><code>, </code><code>*</code><code>args, </code><code>*</code><code>*</code><code>kwargs):</code>
<code> </code><code>print</code><code>(</code><code>'====>'</code><code>)</code>
<code>obj </code><code>=</code> <code>Foo()</code>
<code>obj()</code>
<code>__getattr__</code>
<code>从对象中读取某个属性时,首先需要从</code><code>self</code><code>.__dicts__中搜索该属性,再从__getattr__中查找</code>
<code>__setattr__用来设置对象的属性,通过</code><code>object</code><code>中的__setattr__函数来设置属性</code>
<code>__delattr__用来删除对象的属性</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, x):</code>
<code> </code><code>self</code><code>.x </code><code>=</code> <code>x</code>
<code> </code><code>def</code> <code>__getattr__(</code><code>self</code><code>, item):</code>
<code> </code><code>print</code><code>(</code><code>'getattr'</code><code>)</code>
<code> </code><code>def</code> <code>__setattr__(</code><code>self</code><code>, key, value):</code>
<code> </code><code>def</code> <code>__delattr__(</code><code>self</code><code>, item):</code>
<code> </code><code>self</code><code>.__dict__.pop(item)</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>10</code><code>)</code>
<code>obj.x </code><code>=</code> <code>1</code>
<code>print</code><code>(obj.__dict__)</code>
<code>del</code> <code>obj.x</code>
<code>obj.a </code><code>=</code> <code>1</code>
<code>obj.b </code><code>=</code> <code>2</code>
<code>del</code> <code>obj.a</code>
<code>print</code><code>(obj.aaaaaaaaa</code>
<code>exec</code><code>函数,将字符串中的python代码提取出来执行</code>
<code>s</code><code>=</code><code>"print(x)"</code>
<code>g</code><code>=</code><code>{</code><code>'x'</code><code>:</code><code>100000000</code><code>}</code>
<code>l</code><code>=</code><code>{</code><code>'x'</code><code>:</code><code>1</code><code>}</code>
<code>exec</code><code>(s,g,l)</code>
<code>s </code><code>=</code> <code>"y=2"</code>
<code>exec</code><code>(s, g, l)</code>
<code>print</code><code>(g)</code>
<code>print</code><code>(l)</code>
二、二次加工标准类
例子:
<code>实现迭代器协议</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, n, stop):</code>
<code> </code><code>self</code><code>.n </code><code>=</code> <code>n</code>
<code> </code><code>self</code><code>.stop </code><code>=</code> <code>stop</code>
<code> </code><code>def</code> <code>__next__(</code><code>self</code><code>):</code>
<code> </code><code>if</code> <code>self</code><code>.n > </code><code>self</code><code>.stop:</code>
<code> </code><code>raise</code> <code>StopIteration</code>
<code> </code><code>x </code><code>=</code> <code>self</code><code>.n</code>
<code> </code><code>self</code><code>.n </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>return</code> <code>x</code>
<code> </code><code>def</code> <code>__iter__(</code><code>self</code><code>):</code>
<code> </code><code>return</code> <code>self</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>0</code><code>, </code><code>5</code><code>)</code>
<code>print</code><code>(</code><code>next</code><code>(obj))</code>
<code>实现上下文管理器:</code>
<code> </code><code>def</code> <code>__enter__(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>'enter'</code><code>)</code>
<code> </code><code>def</code> <code>__exit__(</code><code>self</code><code>, exc_type, exc_val, exc_tb):</code>
<code> </code><code>print</code><code>(</code><code>'exit'</code><code>)</code>
<code>with Foo(</code><code>'alex'</code><code>) as x:</code>
<code> </code><code>print</code><code>(x)</code>
<code> </code><code>print</code><code>(</code><code>'=>'</code><code>)</code>
本文转自小白的希望 51CTO博客,原文链接:http://blog.51cto.com/haoyonghui/1939924,如需转载请自行联系原作者