파이썬의 다형성

dalmagi의 이미지

제가 읽고 있는 책에서 파이썬의 다형성에 대해 다루며 다음과 같은 예제를 제시했습니다.

class Animal:
    def cry(self):
        print '...'
 
class Dog(Animal):
    def cry(self):
        print '멍멍'
 
class Duck(Animal):
    def cry(self):
        print '꽥꽥'
 
class Fish(Animal):
    pass
 
for each in (Dog(),Duck(),Fish()):
    each.cry()

제가 생각하기에는 각 동물 클래스들이 Animal 로부터 상속받기는 했지만 그 상속관계로부터 생겨나는 연관성의 이용없이 단지 cry 라는 같은이름만을 이용한 반복호출은 다형성과 상관없다고 생각됩니다.
이런식이라면 상속관계가 없지만 같은이름의 메소드를 가진 여러개의 개체들을 목록에 넣은뒤 루프시켜 그것을 호출하는 방식과 뭐가 다른지 모르겠습니다.
위의 예제에서 Animal 클래스를 없앤다고 하더라도 결과는 같지 않겠습니까?
저의 다형성에 대한 이해가 부족한건가요 아니면 정적언어적인 사고에 머물러있는건가요

ageldama의 이미지

* http://en.wikipedia.org/wiki/Duck_typing

* http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29

실용적인 목적으로 어떤 객체가 같은 메시지들의 집합에 대해서 응답한다는 것을 보장하기 위해서 자바에서처럼 인터페이스를 구현하거나 하실수도 있겠죠.

만일 파이썬이 아니라 다른 StaticTyping 언어에서 저런거는 같은 프로토콜을 구현하거나 같은 상속구조에 있어야 하므로 반드시 Animal일 필요가 있겠지만
동적인 언어에서는 특별히 그런 규제가 없으므로 추가적으로 규제를 주실수도 있겠네요.

* 파이썬-3000에서 데코레이터등을 이용해서 파라메터에 타입제한을 두는것에 대한 이야기 : http://mail.python.org/pipermail/python-3000/2006-July/002646.html
* http://www.python.org/dev/peps/pep-0318/

----
The future is here. It's just not widely distributed yet.
- William Gibson

ageldama의 이미지

* http://en.wikipedia.org/wiki/Duck_typing

* http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29

실용적인 목적으로 어떤 객체가 같은 메시지들의 집합에 대해서 응답한다는 것을 보장하기 위해서 자바에서처럼 인터페이스를 구현하거나 하실수도 있겠죠.

만일 파이썬이 아니라 다른 StaticTyping 언어에서 저런거는 같은 프로토콜을 구현하거나 같은 상속구조에 있어야 하므로 반드시 Animal일 필요가 있겠지만
동적인 언어에서는 특별히 그런 규제가 없으므로 추가적으로 규제를 주실수도 있겠네요.

* 파이썬-3000에서 데코레이터등을 이용해서 파라메터에 타입제한을 두는것에 대한 이야기 : http://mail.python.org/pipermail/python-3000/2006-July/002646.html
* http://www.python.org/dev/peps/pep-0318/

----
The future is here. It's just not widely distributed yet.
- William Gibson

Scarecrow의 이미지

df wrote:

상속관계가 없지만 같은이름의 메소드를 가진 여러개의 개체들을 목록에 넣은뒤

와 같은 상황이라면 여러개의 개체들 중에서 같은이름의 메소드를 일일이 다 찾아다니며
일일이 바꿔주는 작업을 반복적으로 해야 합니다.

하지만 예제코드와 같은 방식으로 짜여져 있다면
animal객체의 cry()메소드만을 수정해 주면
그것을 사용하는 하위객체들은 알아서 다 변경됩니다.(Fish가 해당되겠군요.)

또한 상위객체의 메소드변경과 관계없이 자기의 메소드를 가져야 하는 경우는
즉 상위객체 메소드가 변경되었다고 해서 자신의 메소드가 변경되면 안되는 경우는
알아서 변경이 안됩니다.(Dog와 Duck이 해당되겠군요.)

또한 이것 말고도 상속관계가 없지만 같은이름의 메소드를 가진 여러개의 개체와의
차이점은 여럿 생각해 볼 수 있겠지요

시그너쳐: ./configure --prefix=/usr; make; sudo checkinstall

pok의 이미지

파이썬은 잘 모르겠지만, 만일 Animal 이 없다면 for each 에 들어가는 자료형은 무엇일까요?
상속관계없이 같은 이름의 메소드를 부르면 작동하게끔 만들어진것도 다형성이라고 합니다. 이런것을 지원하는 언어는 무척 드뭅니다. 대표적으로 지원하는 경우가 C++ 인데, 템플릿과 암시적 인터페이스를 이용한 컴파일 타임 다형성을 지원합니다.

파이썬의 자료형변환을 잘 모르고 하는말이지만, 아마 for each에 들어간녀석이 Animal 자료형일껍니다. 아니면, 자바에서는 모든 사용자 정의형(클래스)은 Object 를 상속받는데, 파이썬도 그런구조라면 Object 일지도 모르겠군요. 그리고는 실행시간시에 타입을 자동으로 캐스팅 하는 거겠죠.


poklog at http://poksion.cafe24.com/poklog/

hongminhee의 이미지

Python은 덕 타이핑(duck typing)을 합니다. 말씀대로 굳이 Animal 클래스를 상속받지 않아도 cry()만 호출하면 다형성이 이루어지겠죠. 그렇지만 저는 그것이 문제가 되는지 잘 모르겠네요. Java, C++와 같이 변수에 타입이 있는 언어에서의 OO와 Python, Ruby와 같이 객체에 타입이 있는 언어에서의 OO는 다른 부분이 많다고 생각합니다. 일장일단이 있겠죠.

Mintcherry 님께서 말씀하셨듯이 Python에서의 상속은 인터페이스로서의 용도보다는 단순히 수퍼클래스를 특수화한 또다른 서브클래스를 만드는 정도로 보는 것이 좋지 않을까 합니다~.

hongminhee의 이미지

아, 그리고 상속에 관한 새로운 관점을 얻고 싶으시다면 Io, JavaScript, Lua 등의 프로토타입 기반 객체 지향 언어(prototype based object-oriented language)를 사용해보는 것도 재미있을 듯 합니다. 상속과 실체화(instantation)를 복제(clone)라는 더 큰 메타포로 다루는데 재미있습니다~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.