Python & Ruby

Override

오버라이드의 소개

 오버라이드의 형식

Python

Override/1.py

class C1:
    def m(self):
        return 'parent'
class C2(C1):
    def m(self):
        return super().m() + ' child'
    pass
o = C2()
print(o.m())

Ruby

Override/1.rb

class C1
  def m()
    return 'parent'
  end
end
class C2 < C1
  def m()
    return super()+' child'
  end
end
o = C2.new()
p o.m()

실행결과

parent child

Python | Ruby

오버라이드의 활용 (Python)

Override/2.py 

class Cal(object):
    _history = []
    def __init__(self, v1, v2):
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2
    def add(self):
        result = self.v1+self.v2
        Cal._history.append("add : %d+%d=%d" % (self.v1, self.v2, result))
        return result
    def subtract(self):
        result = self.v1-self.v2
        Cal._history.append("subtract : %d-%d=%d" % (self.v1, self.v2, result))
        return result
    def setV1(self, v):
        if isinstance(v, int):
            self.v1 = v
    def getV1(self):
        return self.v1
    @classmethod
    def history(cls):
        for item in Cal._history:
            print(item)
    def info(self):
        return "Cal => v1 : %d, v2 : %d" % (self.v1, self.v2)
class CalMultiply(Cal):
    def multiply(self):
        result = self.v1*self.v2
        Cal._history.append("multiply : %d*%d=%d" % (self.v1, self.v2, result))
        return result
    def info(self):
        return "CalMultiply => %s" % super().info()
class CalDivide(CalMultiply):
    def divide(self):
        result = self.v1/self.v2
        Cal._history.append("divide : %d/%d=%d" % (self.v1, self.v2, result))
        return result
    def info(self):
        return "CalDivide => %s" % super().info()

c0 = Cal(30, 60)
print(c0.info())
c1 = CalMultiply(10,10)
print(c1.info())
c2 = CalDivide(20,10)
print(c2.info())

Cal => v1 : 30, v2 : 60
CalMultiply => Cal => v1 : 10, v2 : 10
CalDivide => CalMultiply => Cal => v1 : 20, v2 : 10

ideone.com

오버라이드의 활용 (Ruby)

Override/2.rb 

class Cal
  attr_reader :v1, :v2
  attr_writer :v1
  @@_history = []
  def initialize(v1,v2)
    @v1 = v1
    @v2 = v2
  end
  def add()
    result = @v1+@v2
    @@_history.push("add : #{@v1}+#{@v2}=#{result}")
    return result
  end
  def subtract()
    result = @v1-@v2
    @@_history.push("subtract : #{@v1}-#{@v2}=#{result}")
    return result
  end
  def setV1(v)
    if v.is_a?(Integer)
      @v1 = v
    end
  end
  def getV1()
    return @v1
  end
  def Cal.history()
    for item in @@_history
      p item
    end
  end
  def info()
    return "Cal => v1 : #{@v1}, v2 : #{@v2}"
  end
end
class CalMultiply < Cal
  def multiply()
    result = @v1*@v2
    @@_history.push("multipy : #{@v1}*#{@v2}=#{result}")
    return result
  end
  def info()
    return "CalMultiply => #{super()}"
  end
end
class CalDivide < CalMultiply
  def divide()
    result = @v1/@v2
    @@_history.push("divide : #{@v1}/#{@v2}=#{result}")
    return result
  end
  def info()
    return "CalDivide => #{super()}"
  end
end
c0 = Cal.new(30, 60)
p c0.info()
c1 = CalMultiply.new(10, 10)
p c1.info()
c2 = CalDivide.new(20, 10)
p c2.info()

ideone.com

 참고

github

댓글

댓글 본문
작성자
비밀번호
  1. 닐반
    2018. 10. 14.
  2. 유닉스가이
    감사합니다.
  3. Ji Yeoun Park
    2018.7.03 감사합니다.
  4. 정병찬
    2018 06 28
    수강완료
  5. 언어정복자
    2018.1.1 올해도 열공 할게요.
  6. remake
    뒷 수업 실습하다가 원인을 알았습니다.
    ruby로 실행되어야 했는데, ruby rails라는 걸로 실행이 되었던 거였군요.
    대화보기
    • remake
      1.rb 아톰에서 돌리니까 결과가 깨져 나오네요.
      'rails'��(��) ���� �Ǵ� �ܺ� ���, ������ �� �ִ� ���α׷�, �Ǵ�
      ��ġ ������ �ƴմϴ�.

      커맨드창 띄우고 돌리면 정상으로 나오는데, 다른 분들도 아톰에서 결과가 깨져 나오는지, 어떻게 하면 정상으로 나오게 할 수 있는지 궁금합니다.

      2.rb도 마찬가지네요.
    • 성현아빠
      완료
    • GoldPenguin
      완료햤습니다.
    • 박정우
      너무 좋은 강의 잘 듣고 혼자 공부하는데 많은 도움 받고 있습니다.
      예제를 참 이해하기 쉽고 실습에 도움이 되게 만드셨네요.
      감사합니다.
    • 김태윤
      완료했어요
    • 미림_likelion
      수강 완료했습니다. 감사합니다.
    • 심화평
      2017.07.06 감사합니다~
    • 나만의 부
      2017.4.30 감사합니다~
    • Ino Jeong
      맥이나 리눅스 쓰시는 분들은 터미널에서 직접 python3 override.py 이런식으로 실행해보시면 잘 돌아가는걸 확인하실 수 있을거에요. 아톰에서는 기본으로 설치되어있는 python 2.x 버젼으로 실행해서 super() 쓸 때 에러나는 경우가 있더라고요.
    • 컴맹공돌
      python 3 버전을 쓰는데도 계속 super() takes at least 1 argument (0 given)이러한 오류가 나서 진도를 나가지를 못하고 있네요.
      인터넷에서 찾아봐도 3.0버전에서 개선이 되서 super() 저 괄호 안에 특정 요소가 없어도 이고잉 님의 코드대로 적으면 오류가 안 날 것 같은데 계속 나는 이유 혹시 알 수 있을까요?
    • 문돌이
      감사합니다 잘 이해하였습니다 :)
    • Philip Oh
      감사합니다:)
    • 환글
      Override 가 그런 뜻이었군요 고맙습니다~~~
    • Mike Kang
      감사합니다 항상 잘 보고 있습니다
    • ㅇㅇ
      ^______________________________________________________________^
    • Dellivan
      아톰 경우 python 버전이 다르다보니 그런 것 같네요.

      cmd 나 터미널로 파일경로 들어가셔서 python3 1.py 하면 원하는 값 얻을 수 있습니다.
      대화보기
      • JustStudy
        단연 으뜸 강의!
        고맙습니다
      • hardrain
        "음 뭐랄까요 " 를 자주 사용하시는군요 ... ㅎㅎㅎ
      • 할로
        파이썬 2.x 에서는 super 내부에 클래스 네임과 self 가 들어가야 작동하네요. 위의 예제는 3.x 버전 기준으로 작성되어서 파수꾼님과 같은 에러가 발생하는것 같아요

        Python 2.x:
        return "CalMultiply => %s" % super(CalMultiply, self).info()
      • 파수꾼
        2.py에서 TypeError: super() takes at least 1 argument (0 given)이라는 메세지가 계속 뜨네요...작성해 놓은 예제를 카피해서 실행해도 같은 결과가 나옵니다.
      • Frank
        지난번 동영상에서 알았던 것을 시간이 지나니 잊어 버렸네요. ^^;
      • suriing
        좋은강의 감사합니다^^
      • Frank
        고맙습니다. ^^
      • egoing
        수정했습니다! 알려주셔서 감사합니다. ^^
        대화보기
        • Frank
          오버라이드의 소개 동영상에서 4분24초부터 5분 25초 사이에 화면이 까맣게 되고, 소리가 나지 않습니다.
          저만 그런지요?
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기