[단기] 04. Feature IMAGE 추출

한국어

안녕하세요?

이번시간에는 저번시간에 하기로 했던.. URL 로부터 feature 이미지를 가져오는 기능을 구현하도록 하겠습니다.

아래는 대전 멤버쉽 남두현님의 정규식관련 자료입니다.

이번 기능 구현에 많은 도움을 주셨습니다.

AD

더보기


Python Assignment 5

Author : 2009135046, Doohyun Nam

• [1번 문제] 클래스와 모듈의 공통점과 차이점에 대해 설명하시오.

클래스와 모듈의 공통점은 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 저장하는 것을 말하며, 별도의 이름공간을 가지고 있다. 이러한 이유는 재사용성과 유지보수 측면에 초점을 맞추고 있다. 차이점이라면, 모듈은 파일단위로 이름공간을 정의하고, 클래스는 클래스 공간에 이름공간을 구성한다.

• [2번 문제] 다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오.

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 함수에서 매개변수를 default로 1로 초기화 하여 충족시켰다.
-Needs2 : str 함수를 이용하면 java의 toString과 같은 효과를 볼 수 있다.
-Needs3 : 요구사항대로 값을 증가시켰다.
-Needs4 : call 함수를 사용하여, incr 함수를 인스턴스로 불러냈다.
-Needs5 : sum , sub 함수를 사용하여 개발했다. 확장성을 생각하여, 템플릿 메소드 패턴을 적용하기 위한 operatorHelper() 라는 메소드를 두어, 동적으로 연산자가 결정되도록 진행했다. 연산은 정수뿐이 아닌 다른 type도 들어올 수 있도록 개발했다.
-Needs6 : cmp 함수를 사용했다. 위와 같이 다른 type에 대응할 수 있도록 제작했다. cmp 함수를 사용하면, 별다른 알고리즘 없이 진행할 수 있다.

• [4번 문제] 다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 init (), str() (), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.

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


,


8


,


9


])


s


=


s



자 그럼 이제 시작하도록 하겠습니다.

순서

1. HTML 데이터를 받아옵니다.

2. <body> 데이터만 가져옵니다.

3. <script> 데이터 삭제합니다.

4. <img> 태그만 가져옵니다.

5. 가져온 태그를 이용하여 메인 이미지를 추출한다.

> 추출하는 것에 대해 이미지 크기가 큰걸로 추출하려고 합니다.

이미지 추출의 경우.

위와 같은 순서로 진행을 하려고 했지만 , 제 능력이 되지 않아. 메타태그의 이미지를 가져오는 것으로 돌아갔습니다.

시간내에 맞춰야하는 부분도 있고, 알고리즘 공부도 아에 안할 수가 없는게 핑계라면 핑계입니다.

없는 기사들에 대해서는 저희 로고를 가운데 박아서 띄워주는 것으로 처리하였습니다.

다음과 같은 결과물을 얻을 수 있었습니다.

시간이된다면, 정규식을 통해 정리해놓은 img 태그에서 feature 이미지를 추출하는 부분을 진행해볼 예정입니다.

</div>
</div> </div> </div> </main> </div>
AD