回答編集履歴

3

追記

2018/10/06 14:29

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -121,3 +121,53 @@
121
121
  また、属性の読み取り/書き換えをフックできるので、
122
122
 
123
123
  例えば不正な値の代入を防ぐ機能を簡単に付け加えることができます。
124
+
125
+
126
+
127
+ プロパティもどき
128
+
129
+ ---
130
+
131
+ 気付かないうちに質問の内容が挿げ替わっていたので。
132
+
133
+ こんなふうな実装なんじゃないでしょうかね。
134
+
135
+ ```Python
136
+
137
+ class MyProperty:
138
+
139
+ def __init__(self, fget=None, fset=None):
140
+
141
+ self._fget = fget
142
+
143
+ self._fset = fset
144
+
145
+
146
+
147
+ def __get__(self, instance, owner):
148
+
149
+ if self._fget is None:
150
+
151
+ raise AttributeError("unreadable attribute")
152
+
153
+
154
+
155
+ return self._fget(instance)
156
+
157
+
158
+
159
+ def __set__(self, instance, value):
160
+
161
+ if self._fset is None:
162
+
163
+ raise AttributeError("can't set attribute")
164
+
165
+
166
+
167
+ self._fset(instance, value)
168
+
169
+ ```
170
+
171
+
172
+
173
+ これを見て全然イメージが湧かないなら、細かな疑問は一回捨てて勉強を進めた方が良いです。

2

追記

2018/10/06 14:29

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -50,11 +50,13 @@
50
50
 
51
51
 
52
52
 
53
+ ---
54
+
53
55
  > それだとわざわざproperty()を設定した意味がなくなるような気がしてなりません。
54
56
 
55
57
 
56
58
 
57
- 今回の場合fdelを指定しなかったので、削除不可の属性ができました。
59
+ 前述のとおり、今回fdelを指定しなかったことにより削除不可の属性ができました。
58
60
 
59
61
  同様にfsetを指定しないと、読み取り専用の属性が作れます。
60
62
 
@@ -111,3 +113,11 @@
111
113
 
112
114
 
113
115
  どちらかと言うとこの目的でpropertyを利用することが多いです。
116
+
117
+
118
+
119
+ ---
120
+
121
+ また、属性の読み取り/書き換えをフックできるので、
122
+
123
+ 例えば不正な値の代入を防ぐ機能を簡単に付け加えることができます。

1

追記

2018/10/06 13:56

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  この場合『内部で何が行われているか』より『どのようなことが起きるか』の方が大事です。
6
6
 
7
- リファレンス ([Python 標準ライブラリ » property](https://docs.python.jp/3/library/functions.html#property)) を見ると、property関数の引数は次のようになっています。
7
+ [リファレンス](https://docs.python.jp/3/library/functions.html#property) を見ると、property関数の引数は次のようになっています。
8
8
 
9
9
  > class property(fget=None, fset=None, fdel=None, doc=None)
10
10
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  **実行結果** [Wandbox](https://wandbox.org/permlink/fh2hagGzEHrtoPXt)
32
32
 
33
- ```
33
+ ```plain
34
34
 
35
35
  10
36
36
 
@@ -57,3 +57,57 @@
57
57
  今回の場合fdelを指定しなかったので、削除不可の属性ができました。
58
58
 
59
59
  同様にfsetを指定しないと、読み取り専用の属性が作れます。
60
+
61
+ ```Python
62
+
63
+ class Prop:
64
+
65
+ def __init__(self):
66
+
67
+ self.__x = 0
68
+
69
+
70
+
71
+ def getx(self):
72
+
73
+ return self.__x
74
+
75
+
76
+
77
+ x = property(getx)
78
+
79
+
80
+
81
+
82
+
83
+ i = Prop()
84
+
85
+ print(i.x)
86
+
87
+ i.x = 10
88
+
89
+ print(i.x)
90
+
91
+ ```
92
+
93
+
94
+
95
+ **実行結果** [Wandbox](https://wandbox.org/permlink/w2zMfypuyVpmbyN5)
96
+
97
+ ```plain
98
+
99
+ 0
100
+
101
+ Traceback (most recent call last):
102
+
103
+ File "prog.py", line 13, in <module>
104
+
105
+ i.x = 10
106
+
107
+ AttributeError: can't set attribute
108
+
109
+ ```
110
+
111
+
112
+
113
+ どちらかと言うとこの目的でpropertyを利用することが多いです。