안녕하세요?
이번시간에는 저번시간에 하기로 했던.. URL 로부터 feature 이미지를 가져오는 기능을 구현하도록 하겠습니다.
아래는 대전 멤버쉽 남두현님의 정규식관련 자료입니다.
이번 기능 구현에 많은 도움을 주셨습니다.
더보기
Python Assignment 5
Author : 2009135046, Doohyun Nam
• [1번 문제] 클래스와 모듈의 공통점과 차이점에 대해 설명하시오.
클래스와 모듈의 공통점은 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 저장하는 것을 말하며, 별도의 이름공간을 가지고 있다. 이러한 이유는 재사용성과 유지보수 측면에 초점을 맞추고 있다. 차이점이라면, 모듈은 파일단위로 이름공간을 정의하고, 클래스는 클래스 공간에 이름공간을 구성한다.
• [2번 문제] 다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오.
# -*- 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
함수에서 매개변수를 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번 모두 같이 적었다.
# -*- 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>