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. ㅇㅇ
    ^______________________________________________________________^
  2. 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 자세히 보기