こんにちは。
今回は前回お話しした、URLからfeature画像を取得する機能を実装します。
以下は、大田メンターシップのナム・ドゥヒョンさんが作成した正規表現関連の資料です。
今回の機能実装に多大な助けをいただきました。
続きを読む
Python Assignment 5
Author : 2009135046, Doohyun Nam
• [問題1] クラスとモジュールの共通点と相違点について説明しなさい。
クラスとモジュールの共通点は、類似または関連する機能を持つ関数や定数値をまとめて保存することであり、それぞれ独立した名前空間を持っている点です。これを行う理由は、再利用性と保守性に焦点を当てているからです。相違点としては、モジュールはファイル単位で名前空間を定義し、クラスはクラス空間内に名前空間を構成する点です。
• [問題2] ポリモーフィズムについて説明し、ポリモーフィズムを示す自分自身のPythonコード例を提示しなさい。
# -*- coding: utf-8 -*-
class
FlyBehavior
:
def
fly
(
self
):
pass
class
FlyWithWings
(
FlyBehavior
):
def
fly
(
self
):
print
"飛ぶ"
class
FlyNoWay
(
FlyBehavior
):
def
fly
(
self
):
print
"飛べない"
class
QuackBeHavior
:
def
quack
(
self
):
pass
class
Quack
(
QuackBeHavior
):
def
quack
(
self
):
print
"ガーガー"
class
Squack
(
QuackBeHavior
):
def
quack
(
self
):
print
"ピヨピヨ"
class
MuteQuack
(
QuackBeHavior
):
def
quack
(
self
):
print
""
class
Duck
:
def
__init__
(
self
,
quack
,
fly
):
self
.
quackBeHavior
=
quack
self
.
flyBehavior
=
fly
def
quack
(
self
):
self
.
quackBeHavior
.
quack
()
def
fly
(
self
):
self
.
flyBehavior
.
fly
()
mallardDuck
=
Duck
(
Quack
(),
FlyWithWings
())
rubberDuck
=
Duck
(
Squack
(),
FlyNoWay
())
mallardDuck
.
fly
()
rubberDuck
.
fly
()
mallardDuck
.
quack
()
rubberDuck
.
quack
()
[解答] 継承関係にある異なるクラスのインスタンスが、同じメンバー関数呼び出しに対してそれぞれ異なる反応をするようにする機能。演算子オーバーロードもポリモーフィズムをサポートする重要な技術である。
[例題] デザインパターンの一つであるストラテジーパターンを使用した例である。FlyBehavior、QuackBeHaviorを継承したそれぞれの行動に対して、実行時に各オブジェクトは異なる反応をサポートしている。次の例は、継承されたquackやsquackよりも、これを構成関係に持つduckオブジェクトの方が重要である。duckオブジェクトが初期化されるとき、どのようなオブジェクトを持っているかによって異なる行動を取ることができる。
• [問題3] 次の各要件をすべて満たすCounterクラスをコーディングしなさい(正解を各要件ごとに分ける必要はなく、問題3に対して1つのクラス定義コードを提示すればよい)。
# -*- coding: utf-8 -*-
class
Counter
(
object
):
def
__init__
(
self
,
value
,
step
=
1
):
self
.
step
=
step
self
.
value
=
value
def
incr
(
self
):
self
.
value
+=
self
.
step
def
__str__
(
self
):
return
str
(
self
.
value
)
def
__call__
(
self
):
self
.
incr
()
def
__add__
(
self
,
other
):
return
self
.
operatorHelper
(
other
,
"+"
)
def
__sub__
(
self
,
other
):
return
self
.
operatorHelper
(
other
,
"-"
)
def
operatorHelper
(
self
,
other
,
code
):
try
:
if
type
(
self
)
==
type
(
other
):
exec
(
compile
(
"self.value
%s
= other.value"
%
code
,
'<string>'
,
'single'
))
exec
(
compile
(
"self.step
%s
= other.step"
%
code
,
'<string>'
,
'single'
))
else
:
exec
(
compile
(
"self.value
%s
= int(other)"
%
code
,
'<string>'
,
'single'
))
except
:
pass
return
self
def
__cmp__
(
self
,
other
):
value
=
other
;
try
:
if
type
(
self
)
==
type
(
other
):
value
=
other
.
value
else
:
value
=
int
(
other
)
except
:
pass
return
cmp
(
self
.
value
,
value
)
#要件1
c
=
Counter
(
10
)
d
=
Counter
(
10
,
2
)
#要件2
print
"要件2出力"
print
c
,
d
#要件3
c
.
incr
()
d
.
incr
()
print
"要件3出力"
print
c
,
d
#要件4
c
()
d
()
print
"要件4出力"
print
c
,
d
#要件5
c
=
c
+
5
d
=
d
-
5
print
"要件5出力"
print
c
,
d
#要件6
print
"要件6出力"
print
c
>
10
print
d
>
10
print
c
<
10
print
d
<
10
print
c
==
"17"
print
d
!=
"9"
print
c
>
d
[解答]
-Needs1: __init__関数でパラメーターをデフォルトで1に初期化することで要件を満たした。
-Needs2: __str__関数を利用すると、JavaのtoStringと同じ効果を得ることができる。
-Needs3: 要件通りに値を増加させた。
-Needs4: __call__関数を使用して、incr関数をインスタンスとして呼び出した。
-Needs5: __add__、__sub__関数を使用して開発した。拡張性を考慮し、テンプレートメソッドパターンを適用するためのoperatorHelper()というメソッドを設け、動的に演算子が決定されるようにした。演算は整数だけでなく、他のタイプが入ってくる可能性も考慮して開発した。
-Needs6: __cmp__関数を使用した。上記と同様に、異なるタイプに対応できるように作成した。cmp関数を使用すれば、特別なアルゴリズムなしに進めることができる。
• [問題4] 次は内蔵データ型listをサブクラス化して作成したMySetクラスの定義内容である。次のクラス定義において、__init__()、__str__()、eliminate_duplicate()の3つのメソッドのコード内容について、自分が他人に教えると考えて説明しなさい。
• [問題5] 問題4で定義したMySetクラスにメソッドを追加し、次の各要件をすべて満たすコーディングを提示しなさい(正解を各要件ごとに分ける必要はなく、問題5に対して1つのMySetクラス定義コードを提示すればよい)。
• [問題6] 問題5で定義したMySetクラスに対して次の例題を実行すると、エラーなく正しく動作することを確認できる。次の例題内にあるlen()、bool()内蔵関数とinキーワードの使用例が、特別なメソッド定義をしていないにもかかわらず正しく実行される理由を説明しなさい。 - 解説は4、5、6番すべてまとめて記述した。
# -*- coding: utf-8 -*-
import
copy
class
MySet
(
list
):
def
__init__
(
self
,
l
):
for
e
in
l
:
self
.
append
(
e
)
MySet
.
eliminate_duplicate
(
self
)
def
__str__
(
self
):
result
=
"MySet: {"
for
e
in
self
:
result
=
result
+
str
(
e
)
+
" ,"
result
=
result
[
0
:
len
(
result
)
-
2
]
+
"}"
return
result
def
__or__
(
self
,
other
):
return
MySet
(
self
+
other
)
def
__and__
(
self
,
other
):
s
=
[]
for
e
in
other
:
if
e
in
self
:
s
.
append
(
e
)
return
MySet
(
s
)
def
__sub__
(
self
,
other
):
s
=
[]
for
e
in
self
:
if
e
not
in
other
:
s
.
append
(
e
)
return
MySet
(
s
)
@staticmethod
def
eliminate_duplicate
(
l
):
s
=
[]
for
e
in
l
:
if
e
not
in
s
:
s
.
append
(
e
)
l
[:]
=
[]
for
e
in
s
:
l
.
append
(
e
)
#要件1
print
"要件1出力"
s
=
MySet
([
1
,
2
,
2
,
3
])
t
=
MySet
([
2
,
3
,
4
,
5
,
6
,
7
,
8
,
8
,
8
,
8
,
8
<span---
layout: post
title: "[短期] 04. Feature IMAGE 抽出"
description: "こんにちは。今回は前回お話しした、URLからFeature画像を取得する機能を実装します。以下は、大田メンターシップのナム・ドゥヒョンさんが作成された正規表現に関する資料です。今回の機能実装において多くの助けとなりました。続きを読む Python Assignment 5 著者..."
date: 2015-02-06 02:09:08 +0900
section: blog
category: projects
lang: ja
ref: 2015-02-06-legacy-11-projects-04-feature-image
tags:
- "TJSSM"
- "projects"
---
こんにちは。
今回は、前回お話ししたURLからFeature画像を取得する機能を実装していきます。
以下は、大田メンターシップのナム・ドゥヒョンさんが作成された正規表現に関する資料です。
今回の機能実装において多くの助けとなりました。
続きを読む
Python Assignment 5
著者 : 2009135046, Nam Doohyun
• [問1] クラスとモジュールの共通点と相違点について説明しなさい。
クラスとモジュールの共通点は、似ている、または関連する関数や定数値を集めて保存する点であり、それぞれ独自の名前空間を持っていることです。これは再利用性と保守性の向上に焦点を当てています。相違点は、モジュールはファイル単位で名前空間を定義するのに対し、クラスはクラス空間内に名前空間を構成する点です。
• [問2] ポリモーフィズム(多態性)について説明し、ポリモーフィズムを示す独自のPythonコード例を提示しなさい。
In [23]:
# -*- coding: utf-8 -*-
class
FlyBehavior
:
def
fly
(
self
):
pass
class
FlyWithWings
(
FlyBehavior
):
def
fly
(
self
):
print
"飛ぶ"
class
FlyNoWay
(
FlyBehavior
):
def
fly
(
self
):
print
"飛べない"
class
QuackBeHavior
:
def
quack
(
self
):
pass
class
Quack
(
QuackBeHavior
):
def
quack
(
self
):
print
"ガーガー"
class
Squack
(
QuackBeHavior
):
def
quack
(
self
):
print
"ピーピー"
class
MuteQuack
(
QuackBeHavior
):
def
quack
(
self
):
print
""
class
Duck
:
def
__init__
(
self
,
quack
,
fly
):
self
.
quackBeHavior
=
quack
self
.
flyBehavior
=
fly
def
quack
(
self
):
self
.
quackBeHavior
.
quack
()
def
fly
(
self
):
self
.
flyBehavior
.
fly
()
mallardDuck
=
Duck
(
Quack
(),
FlyWithWings
())
rubberDuck
=
Duck
(
Squack
(),
FlyNoWay
())
mallardDuck
.
fly
()
rubberDuck
.
fly
()
mallardDuck
.
quack
()
rubberDuck
.
quack
()
[解説] 継承関係にある異なるクラスのインスタンスが、同じメソッド呼び出しに対してそれぞれ異なる反応をする機能。演算子オーバーロードもポリモーフィズムをサポートする重要な技術である。
[例] デザインパターンのうち「ストラテジーパターン(Strategy Pattern)」を使用した例である。FlyBehavior、QuackBeHaviorを継承したそれぞれの行動に対し、実行時に各オブジェクトは異なる反応をする。この例では、継承されたquackやsquackよりも、それらを構成要素として持つDuckオブジェクトが重要となる。Duckオブジェクトの初期化時にどのオブジェクトを持っているかによって、異なる行動を取ることができる。
• [問3] 次の各要件をすべて満たすCounterクラスをコーディングしなさい(回答は各要件ごとに分ける必要はなく、第3問として1つのクラス定義コードを提示すればよい)。
In [21]:
# -*- coding: utf-8 -*-
class
Counter
(
object
):
def
__init__
(
self
,
value
,
step
=
1
):
self
.
step
=
step
self
.
value
=
value
def
incr
(
self
):
self
.
value
+=
self
.
step
def
__str__
(
self
):
return
str
(
self
.
value
)
def
__call__
(
self
):
self
.
incr
()
def
__add__
(
self
,
other
):
return
self
.
operatorHelper
(
other
,
"+"
)
def
__sub__
(
self
,
other
):
return
self
.
operatorHelper
(
other
,
"-"
)
def
operatorHelper
(
self
,
other
,
code
):
try
:
if
type
(
self
)
==
type
(
other
):
exec
(
compile
(
"self.value
%s
= other.value"
%
code
,
'<string>'
,
'single'
))
exec
(
compile
(
"self.step
%s
= other.step"
%
code
,
'<string>'
,
'single'
))
else
:
exec
(
compile
(
"self.value
%s
= int(other)"
%
code
,
'<string>'
,
'single'
))
except
:
pass
return
self
def
__cmp__
(
self
,
other
):
value
=
other
;
try
:
if
type
(
self
)
==
type
(
other
):
value
=
other
.
value
else
:
value
=
int
(
other
)
except
:
pass
return
cmp
(
self
.
value
,
value
)
#要件1
c
=
Counter
(
10
)
d
=
Counter
(
10
,
2
)
#要件2
print
"要件2 出力"
print
c
,
d
#要件3
c
.
incr
()
d
.
incr
()
print
"要件3 出力"
print
c
,
d
#要件4
c
()
d
()
print
"要件4 出力"
print
c
,
d
#要件5
c
=
c
+
5
d
=
d
-
5
print
"要件5 出力"
print
c
,
d
#要件6
print
"要件6 出力"
print
c
>
10
print
d
>
10
print
c
<
10
print
d
<
10
print
c
==
"17"
print
d
!=
"9"
print
c
>
d
[解説]
- 要件1: __init__関数で引数をデフォルト1で初期化することで満たした。
- 要件2: __str__関数を利用すると、JavaのtoStringと同様の効果を得られる。
- 要件3: 要件通りに値を増加させた。
- 要件4: __call__関数を使用して、incr関数をインスタンスから呼び出せるようにした。
- 要件5: __add__、__sub__関数を使用して開発した。拡張性を考慮し、「テンプレートメソッドパターン」を適用するためoperatorHelper()というメソッドを設け、動的に演算子が決定されるようにした。演算は整数だけでなく他の型も入り得るようにした。
- 要件6: __cmp__関数を使用した。上記と同様に他の型に対応できるように制作した。cmp関数を使用すれば、特別なアルゴリズムなしに進めることができる。
• [問4] 次は内蔵データ型listをサブクラス化して作成したMySetクラス定義の内容である。次のクラス定義から、__init__()、__str__()、eliminate_duplicate()の3つのメソッドコード内容について、自分が他人に教えるつもりで説明しなさい。
• [問5] 4番の問題で定義されたMySetクラスにメソッドを追加し、次の各要件すべてを満たすコーディングを提示しなさい(回答は各要件ごとに分ける必要はなく、第5問として1つのMySetクラス定義コードを提示すればよい)。
• [問6] 5番の問題で定義したMySetクラスに対して次の例を実行すると、エラーなく正しく動作することを確認できる。次の例にあるlen()、bool()内蔵関数とinキーワード使用例が、特別なメソッド定義をしなくても正しく実行される理由を説明しなさい。 - 解説は4、5、6番すべてまとめて記述した。
In [1]:
# -*- coding: utf-8 -*-
import
copy
class
MySet
(
list
):
def
__init__
(
self
,
l
):
for
e
in
l
:
self
.
append
(
e
)
MySet
.
eliminate_duplicate
(
self
)
def
__str__
(
self
):
result
=
"MySet: {"
for
e
in
self
:
result
=
result
+
str
(
e
)
+
" ,"
result
=
result
[
0
:
len
(
result
)
-
2
]
+
"}"
return
result
def
__or__
(
self
,
other
):
return
MySet
(
self
+
other
)
def
__and__
(
self
,
other
):
s
=
[]
for
e
in
other
:
if
e
in
self
:
s
.
append
(
e
)
return
MySet
(
s
)
def
__sub__
(
self
,
other
):
s
=
copy
.
deepcopy
(
self
)
for
e
in
self
:
if
e
in
other
:
s
.
remove
(
e
)
return
MySet
(
s
)
@staticmethod
def
eliminate_duplicate
(
l
):
s
=
[]
for
e
in
l
:
if
e
not
in
s
:
s
.
append
(
e
)
l
[:]
=
[]
for
e
in
s
:
l
.
append
(
e
)
#要件1
print
"要件1 出力"
s
=
MySet
([
1
,
2
,
2
,
3
])
t
=
MySet
([
2
,
3
,
4
,
5
,
6
,
7
,
8
,
8
,
8
,
8
,