[短期] 04. Feature IMAGE 抽出

こんにちは。

今回は前回お話しした、URLからfeature画像を取得する機能を実装します。

以下は、大田メンターシップのナム・ドゥヒョンさんが作成した正規表現関連の資料です。

今回の機能実装に多大な助けをいただきました。

続きを読む


Python Assignment 5

Author : 2009135046, Doohyun Nam

• [問題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


()

飛ぶ
飛べない
ガーガー
ピヨピヨ

[解答] 継承関係にある異なるクラスのインスタンスが、同じメンバー関数呼び出しに対してそれぞれ異なる反応をするようにする機能。演算子オーバーロードもポリモーフィズムをサポートする重要な技術である。
[例題] デザインパターンの一つであるストラテジーパターンを使用した例である。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

要件2出力
10 10
要件3出力
11 12
要件4出力
12 14
要件5出力
17 9
要件6出力
True
False
False
True
True
False
True

[解答]
-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番すべてまとめて記述した。

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


=


[]


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

要件2 出力
10 10
要件3 出力
11 12
要件4 出力
12 14
要件5 出力
17 9
要件6 出力
True
False
False
True
True
False
True

[解説]
- 要件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


,


AD