Pythonの基本。マジックメソッドと例外処理
I. マジックメソッド
1. アトリビュート・アクセス
オブジェクトのプロパティには、通常、ドット(...)演算子を使ってアクセスすることができます。
class C:
def __init__(self):
self.x='X-man'
c=C()
c.x
'X-man'
getattr(c , 'x' , 'wood has this attribute')
'X-man'
getattr(c , 'y' , 'wood has this attribute')
'wood has this attribute'
マジックメソッド :
(1) 存在しない属性を取得しようとした場合の動作を定義する。
__getattr__(self,name)
(2) クラスの属性にアクセスしたときの振る舞いを定義する。
__getattribute__(self,name)
(3) 属性が設定されたときの動作を定義する。
__setattr__(self,name,value)
(4) 属性が削除された場合の動作を定義する。
__delattr__(self,name)
2. ディスクリプタ
(1)は属性へのアクセスに使用され、属性の値を返します。
__get__(self,instance,owner)
(2)は属性割り当て操作で呼び出され、何も返しません。
__set__(self,instance,value)
(3) コンテンツを返さずに削除操作を行う制御を行う。
__delete__(self,instance)
class MyDescriptor:
def __get__(self,instance,owner):
print("getting... ",self,instance,owner)
def __set__(self,instance,value):
print("setting... ",self,instance,value)
def __delete__(self,instance):
print("deleting... ",self,instance)
class Test:
x =MyDescriptor()
3. カスタムシーケンス
マジックメソッド :
__len__(self)
__getitem__(self,key)
__setitem__(self,key,value)
__delitem__(self,key)
__iter__(self)
__reversed__(self)
__contains__(self,item)
4. イテレータ
for i in "FishC":
print(i)
F
i
s
h
C
文字列はコンテナであり、繰り返しオブジェクトである。for文はその繰り返し機能を起動させる役割を果たし、コンテナからデータを1つずつ順番に取り出していく、つまり繰り返し操作である。
Pythonはiter()とnext()という2つのBIFを提供しています。
反復可能なオブジェクトに対して iter() を呼び出すとそのイテレータが得られ、next() を呼び出すとイテレータが次の値を返します。
string="FishC"
it=iter(string)
next(it)
'F'
next(it)
'i'
next(it)
's'
next(it)
'h'
next(it)
'C'
5. ジェネレータ
通常のPython関数を呼び出す場合、実行は通常、関数内のコードの最初の行から始まり、return文、例外、またはすべての文が実行されたときに終了します。
II. 例外処理
1. 例外の種類
(1) AssertionError: アサーション文(assert)に失敗した。
my_list=["small_snapper"]
assert len(my_list)>0
my_list.pop()
'small snapper'
assert len(my_list)>0
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
assert len(my_list)>0
AssertionError
(2) AttributeError: 未知のオブジェクト属性にアクセスしようとしました。
my_list=[]
my_list.fishc
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
my_list.fishc
AttributeError: 'list' object has no attribute 'fishc'
(3) IndexError: インデックスがシーケンスの範囲外です。
my_list=[1,2,3]
my_list[3]
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
my_list[3]
IndexError: list index out of range
(4) KeyError: 辞書は存在しないキーワードを探します。
my_dict={"one":1,"two":2}
my_dict["three"]
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
my_dict["three"]
KeyError: 'three'
(5) NameError: 存在しない変数にアクセスしようとしています。
fishc
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
fishc
NameError: name 'fishc' is not defined
(6) OSError: オペレーティングシステムが生成した例外です。
(7) SyntaxError: Python のシンタックスエラーです。
print"I love fishc.com"
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...) ?
(8) TypeError: 異なる型間の操作が無効です。
1+'1'
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
1+'1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
(9) ZeroDivisionError: 割り算がゼロになりました。
5/0
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
5/0
ZeroDivisionError: division by zero
2. try-exceptステートメント
try:
int('abc')
sum =1+'1'
f =open('I am a non-existent document.txt')
print(f.read())
f.close()
except (ValueError,TypeError,OSError) as reason:
print('Error \n error cause is:'+str(reason)')
3. try-finallyステートメント
try:
f =open('I am a non-existent document.txt')
print(f.read())
sum=1+'1'
except:
print('There was an error')
finally:
f.close()
4. raiseステートメント
raise ZeroDivisionError5/0
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
5/0
ZeroDivisionError: division by zero
5. リッチなelse文
try:
int('abc')
except ValueError as reason:
print('There was an error:'+str(reason))
else:
print('There is no exception!')
try:
with open('data.txt','w') as f:
for each_line in f:
print(each_line)
except OSError as reason:
print('There was an error:'+str(reason))
概要
Pythonの基本的なマジックメソッドと例外処理についての説明は以上となります。Pythonのマジックメソッドと例外処理については、過去の記事を検索していただくか、引き続き以下の記事をご覧ください。
関連
-
[解決済み】WindowsでコマンドラインからJupyterを実行する
-
[解決済み】python object() takes no parameters エラー 【終了しました。
-
[解決済み】TypeError: super() takes at least 1 argument (0 given) error is specific to any python version?
-
[解決済み] TypeError: NoneTypeではなく、strでなければならない。
-
[解決済み] Python 3 で os.environ を pickle するには?
-
[解決済み] ModuleNotFoundError: cryptography'という名前のモジュールはありません。
-
[解決済み] Pythonの規約である**kwargs vs **kwds vs **kwとは何ですか?
-
[解決済み] リピート機能 python
-
[解決済み] Pythonです。ラムダ関数に1つだけ変数を渡すには?
-
[解決済み] setattr__ の正しい使い方、無限再帰を回避する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】Pip: バージョンが見つかりませんでした。一致するディストリビューションは見つかりませんでした
-
RuntimeWarning: double_scalars に無効な値があることを解決する。
-
[解決済み] Pythonにおけるεの値
-
[解決済み] AttributeError: 'DataFrame' オブジェクトには 'map' という属性がありません。
-
[解決済み] Python は文字列からすべてのアポストロフィを削除します。
-
[解決済み] torch.clampの列依存境界線
-
[解決済み] pkg_resources という名前のモジュールがない
-
OSError: イメージファイルを特定できない
-
'numpy.ndarray' オブジェクトに 'translate' 属性がありません。