天天看點

python學習之面向對象學習進階

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>'====&gt;'</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 &gt; </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>'=&gt;'</code><code>)</code>

     本文轉自小白的希望 51CTO部落格,原文連結:http://blog.51cto.com/haoyonghui/1939924,如需轉載請自行聯系原作者