SlideShare a Scribd company logo
1 of 14
Effective Python
読書会 #4
オズ@Wizard_of_Oz__
Effective
Python
項目28
カスタムコンテナ型はcollections.abcを継承する
単純なユースケースの場合
• Listにメソッドを加えたい
– 要素の頻度を数えるメソッド
– Listを継承したサブクラスを作る
class FrequencyList(list):
def __init__(self, members):
super().__init__(members)
def frequency(self):
counts = {}
for item in self:
counts.setdefault(item, 0)
counts[item] += 1
return counts
単純なユースケースの場合
• Listを継承したサブクラスを作る
– Listの標準機能がすべて使える
foo = FrequencyList([‘a’, ‘b’, ‘a’, ‘c’, ‘b’, ‘a’, ‘d’])
print (‘Length is’, len(foo))
foo.pop()
print(‘After pop:’, repr(foo))
print(‘Frequency:’, foo.frequency())
>>>
Length is 7
After pop: [‘a’, ‘b’, ‘a’, ‘c’, ‘b’, ‘a’]
Frequency: {‘a’ : 3, ‘c’ : 1, ‘b’ : 2}
継承しない場合
• サブクラスではない形でセマンティクスを提供
– 二分木クラスにシーケンスのセマンティクスを提供
class BinaryNode(object):
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
シーケンスの振る舞いの実装
• Pythonはコンテナの振る舞いを
特別な名前を持ったインスタンスメソッドで実装
– シーケンスに添字でアクセス
bar = [1, 2, 3]
bar[0]
– Pythonの解釈
bar.__getitem__(0)
BinaryNodeクラスを
シーケンスのように振る舞わせる
• __getitem__の実装を提供する
– 二分木クラスにシーケンスのセマンティクスを提供
class IndexableNode(BinaryNode):
def _search(self, count, index):
....
# Returns (found, count)
def __getitem__(self, index):
found, _ = self._search(0, index)
if not found:
raise IndexError('Index out of range')
return found.value
BinaryNodeクラスを
シーケンスのように振る舞わせる
class IndexableNode(BinaryNode):
def _search(self, count, index):
found = None
if self.left:
found, count = self.left._search(count, index)
if not found and count == index:
found = self
else:
count += 1
if not found and self.right:
found, count = self.right._search(count, index)
return found, count
# Returns (found, count)
def __getitem__(self, index):
found, _ = self._search(0, index)
if not found:
raise IndexError('Index out of range')
return found.value
BinaryNodeクラスを
シーケンスのように振る舞わせる
• IndexableNode
– 通常の二分木として構築できる
– Listのようにアクセスできる
print('LRR =', tree.left.right.right.value) #LRR = 7
print('Index 0 =', tree[0]) #Index 0 = 2
print('Index 1 =', tree[1]) #Index 1 = 5
print('11 in the tree?', 11 in tree) #11 in the tree? True
print('17 in the tree?', 17 in tree) #17 in the tree? False
print('Tree is', list(tree)) #Tree is [2, 5, 6, 7, 10, 11, 15]
__getitem__を実装した場合の問題点
• シーケンスのセマンティクス全てを提供するには不十分
– __len__という特別なメソッドが必要
len(tree)
>>>
TypeError: object of type ‘IndexableNode’ has no len()
独自のコンテナ型を定義するのは困難
• 他にも特別なメソッドの定義が必要
– countやindexというメソッドが足りない
• collections.abcモジュール
– 典型的なメソッドをすべて提供する抽象基底クラス
– 必要なメソッドの実装がないと教えてくれる
from collections.abc import Sequence
class BadType(Sequence):
pass
foo = BadType()
>>>
TypeError: Can’t instantiate abstract class BadType with abstract methods __getitem__,
__len__
独自のコンテナ型を定義するのは困難
try:
from collections.abc import Sequence
class BadType(Sequence):
pass
foo = BadType()
except:
logging.exception('Expected')
else:
assert False
>>>
TypeError: Can’t instantiate abstract class BadType with abstract methods __getitem__,
__len__
collections.abc
• 抽象基底クラスに必要な全てのメソッドを実装
– 追加メソッドが提供される(indexやcountなど)
– 複雑な型(SetやMutableMapping等)で特に有用
– 実装が必要な特殊メソッドの個数が膨大
class BetterNode(SequenceNode, Sequence):
pass
tree = BetterNode(...)
print('Index of 7 is', tree.index(7)) #Index of 7 is 3
print('Count of 10 is', tree.count(10)) #Count of 10 is 1
まとめ
• 単純なユースケースはPythonのコンテナ型から直接継承
– コンテナ型:listやdictなど
• カスタムコンテナ型を正しく実装するには多数のメソッドが必要
• カスタムコンテナ型はcollections.abcで定義されたインタフェースを継承する
– 必要なインタフェースを備えていることを確かなものにするため

More Related Content

What's hot

Boostライブラリ一周の旅
Boostライブラリ一周の旅 Boostライブラリ一周の旅
Boostライブラリ一周の旅 Akira Takahashi
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話Yasuyuki Maeda
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回Sachiko Kajishima
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」Shin Ise
 
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -Joe_noh
 
Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回Joe_noh
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ理 小林
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Joe_noh
 
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半Joe_noh
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Shintaro Fukushima
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateepocketberserker
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと Haruka Ozaki
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLangYuichi Motoyama
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 
アルゴリズム+データ構造勉強会(9)
アルゴリズム+データ構造勉強会(9)アルゴリズム+データ構造勉強会(9)
アルゴリズム+データ構造勉強会(9)noldor
 

What's hot (20)

Boostライブラリ一周の旅
Boostライブラリ一周の旅 Boostライブラリ一周の旅
Boostライブラリ一周の旅
 
Scalaのオブジェクトの話
Scalaのオブジェクトの話Scalaのオブジェクトの話
Scalaのオブジェクトの話
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
 
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -
 
Elixirだ 第2回
Elixirだ 第2回Elixirだ 第2回
Elixirだ 第2回
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
Python勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージPython勉強会4-制御構文とパッケージ
Python勉強会4-制御構文とパッケージ
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
 
Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半Elixirだ 第1回強化版 後半
Elixirだ 第1回強化版 後半
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIteratee
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと 12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
12-11-30 Kashiwa.R #5 初めてのR Rを始める前に知っておきたい10のこと
 
20071030
2007103020071030
20071030
 
Metaprogramming in JuliaLang
Metaprogramming in JuliaLangMetaprogramming in JuliaLang
Metaprogramming in JuliaLang
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
アルゴリズム+データ構造勉強会(9)
アルゴリズム+データ構造勉強会(9)アルゴリズム+データ構造勉強会(9)
アルゴリズム+データ構造勉強会(9)
 

Viewers also liked

DGR Guidance on Auto Enrolment Jan 2017
DGR Guidance on Auto Enrolment Jan 2017DGR Guidance on Auto Enrolment Jan 2017
DGR Guidance on Auto Enrolment Jan 2017Paul Wood
 
Relacion de economia con diversas ciencias
Relacion de economia con diversas cienciasRelacion de economia con diversas ciencias
Relacion de economia con diversas cienciasEmiliano Neri Figueroa
 
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...Empresario Mauro Libi Crestani
 
Don't need docker
Don't need dockerDon't need docker
Don't need dockerGo Yamada
 
Fellesforelesning uke5
Fellesforelesning uke5Fellesforelesning uke5
Fellesforelesning uke5Reidar Mosvold
 
Redes locales de economía social y solidaria
Redes locales de economía social y solidariaRedes locales de economía social y solidaria
Redes locales de economía social y solidariaJuan Urgiles
 
O level work energy and power
O level work energy and powerO level work energy and power
O level work energy and powerChen Gong
 
Work, power, and energy
Work, power, and energyWork, power, and energy
Work, power, and energymiss mitch
 
Site Plan: Barkingside
Site Plan: BarkingsideSite Plan: Barkingside
Site Plan: BarkingsideGJTP
 
Fracciones equivalentes MATERIAL PARA IMPRIMIR
Fracciones equivalentes MATERIAL PARA IMPRIMIRFracciones equivalentes MATERIAL PARA IMPRIMIR
Fracciones equivalentes MATERIAL PARA IMPRIMIREditorial MD
 

Viewers also liked (14)

DGR Guidance on Auto Enrolment Jan 2017
DGR Guidance on Auto Enrolment Jan 2017DGR Guidance on Auto Enrolment Jan 2017
DGR Guidance on Auto Enrolment Jan 2017
 
Relacion de economia con diversas ciencias
Relacion de economia con diversas cienciasRelacion de economia con diversas ciencias
Relacion de economia con diversas ciencias
 
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...
Mauro Libi Crestani: Team Avelina presente en la edición 52 de la Vuelta al T...
 
Monastero
MonasteroMonastero
Monastero
 
Culture and forching
Culture and forchingCulture and forching
Culture and forching
 
Don't need docker
Don't need dockerDon't need docker
Don't need docker
 
Fellesforelesning uke5
Fellesforelesning uke5Fellesforelesning uke5
Fellesforelesning uke5
 
Redes locales de economía social y solidaria
Redes locales de economía social y solidariaRedes locales de economía social y solidaria
Redes locales de economía social y solidaria
 
MH CET 2017
MH CET 2017MH CET 2017
MH CET 2017
 
O level work energy and power
O level work energy and powerO level work energy and power
O level work energy and power
 
LCR REPORT_EN_WEB
LCR REPORT_EN_WEBLCR REPORT_EN_WEB
LCR REPORT_EN_WEB
 
Work, power, and energy
Work, power, and energyWork, power, and energy
Work, power, and energy
 
Site Plan: Barkingside
Site Plan: BarkingsideSite Plan: Barkingside
Site Plan: Barkingside
 
Fracciones equivalentes MATERIAL PARA IMPRIMIR
Fracciones equivalentes MATERIAL PARA IMPRIMIRFracciones equivalentes MATERIAL PARA IMPRIMIR
Fracciones equivalentes MATERIAL PARA IMPRIMIR
 

Similar to Effective python#28

初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)Masahiro Hayashi
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
Databasedesignforsocialgames 110115195940-phpapp02
Databasedesignforsocialgames 110115195940-phpapp02Databasedesignforsocialgames 110115195940-phpapp02
Databasedesignforsocialgames 110115195940-phpapp02hideki hasegawa
 
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)Masahiro Hayashi
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門kamukiriri
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Prunus 1350
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)Masahiro Hayashi
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語ScalaTanUkkii
 
関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)Suguru Hamazaki
 

Similar to Effective python#28 (20)

たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
Databasedesignforsocialgames 110115195940-phpapp02
Databasedesignforsocialgames 110115195940-phpapp02Databasedesignforsocialgames 110115195940-phpapp02
Databasedesignforsocialgames 110115195940-phpapp02
 
ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門ALPSチュートリアル(4) Python入門
ALPSチュートリアル(4) Python入門
 
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門VS勉強会 .NET Framework 入門
VS勉強会 .NET Framework 入門
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)
 
Scala with DDD
Scala with DDDScala with DDD
Scala with DDD
 
Pythonintro
PythonintroPythonintro
Pythonintro
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
Python opt
Python optPython opt
Python opt
 
プログラミング言語Scala
プログラミング言語Scalaプログラミング言語Scala
プログラミング言語Scala
 
関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)関数プログラミング ことはじめ (再)
関数プログラミング ことはじめ (再)
 

Effective python#28