Python & Ruby

객체와 변수

인캡슐레이션(캡슐화)

 인스턴스 변수의 특성

Python

class C(object):
    def __init__(self, v):
        self.value = v
    def show(self):
        print(self.value)

c1 = C(10)
print(c1.value)
c1.value = 20
print(c1.value)
c1.show()
10
20
20

ideone.com 

Ruby

class C
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
end
c1 = C.new(10)
# p c1.value
# c1.value = 20
c1.show()
10

ideone.com 

 set / get 메소드

Python

class C(object):
    def __init__(self, v):
        self.value = v
    def show(self):
        print(self.value)
    def getValue(self):
        return self.value
    def setValue(self, v):
        self.value = v
c1 = C(10)
print(c1.getValue())
c1.setValue(20)
print(c1.getValue())
10
20

ideone.com

class C
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
  def getValue()
    return @value
  end
  def setValue(v)
    @value = v
  end
end
c1 = C.new(10)
# p c1.value
p c1.getValue()
# c1.value = 20
c1.setValue(20)
p c1.getValue()
10
20

ideone.com

set/get 메소드를 사용하는 이유

Python 

class Cal(object):
    def __init__(self, v1, v2):
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2
    def add(self):
        return self.v1+self.v2
    def subtract(self):
        return self.v1-self.v2
    def setV1(self, v):
        if isinstance(v, int):
            self.v1 = v
    def getV1(self):
        return self.v1
c1 = Cal(10,10)
print(c1.add())
print(c1.subtract())
c1.setV1('one')
c1.v2 = 30
print(c1.add())
print(c1.subtract())
20
0
40
-20

ideone.com

 Ruby

class Cal
  attr_reader :v1, :v2
  attr_writer :v1
  def initialize(v1,v2)
    @v1 = v1
    @v2 = v2
  end
  def add()
    return @v1+@v2
  end
  def subtract()
    return @v1-@v2
  end
  def setV1(v)
    if v.is_a?(Integer)
      @v1 = v
    end
  end
  def getV1()
    return @v1
  end
end
c1 = Cal.new(10,10)
p c1.add()
p c1.subtract()
c1.setV1('one')
c1.v1 = 20
p c1.add()
c1.getV1()
20
0
30

ideone.com

속성

수업에서는 구분하지 않았습니다만 외부에서 접근 가능한 변수를 파이썬은 property 루비는 attribute라고 합니다. 

 Python

class C(object):
    def __init__(self, v):
        self.__value = v
    def show(self):
        print(self.__value)
c1 = C(10)
#print(c1.__value)
c1.show()
10

ideone.com

Ruby

class C
  #attr_reader :value
  #attr_writer :value
  attr_accessor :value
  def initialize(v)
    @value = v
  end
  def show()
    p @value
  end
end
c1 = C.new(10)
p c1.value
c1.value = 20
p c1.value
10
20

ideone.com

참고

github 

댓글

댓글 본문
작성자
비밀번호
  1. 환글
    고맙습니다^^
  2. onaccess1@gmail.com
    # 수정했는데.. 비밀번호가 틀려 다시 쓰네요...ㅜㅜ
    우선 set()를 쓰는 경우는 변수값을 다시 정할때 원치 않은 값의 입력을 막기 위해서죠.. 그래서
    set()를 써야 하는 상황이라면 거의 대부분 class variable이 self.__value 라는 형식으로 막혀있을겁니다.
    왜냐하면 기껏 set()를 써서 막아놨는데.. 직접 c1.v1 = 'one'으로 변경시키면 set()를 만든 의미가 없으니까요..
    그런데 '__'를 붙이면 클래스 밖에서는 읽어들이지 못하니 set()만을 사용하여 값을 걸러주면서 값을 정할수 있지요. 그러니 이때 우리는 get()를 써서 변수를 불러 와야 하는겁니다. 즉 파이썬에서 set()을 사용 하는 경우에는 get()는 당연하게 필요하게 되는거라 봅니다.
    대화보기
    • 김연규
      set은 이해가 가는데, get은 이해가 가지 않네요.
      어차피 get으로 하는것이나 c1.v1로 하는건 읽는 행동이기에 크게 문제가 될것도 없는거같고,, 영상에서도 제가 못들은것인지는 모르겠으나 질문드립니다.
      루비라면 읽기도 금지되니깐 이해가 갑니다만 파이썬은 정말 모르겠네요ㅕ...
      단순히 코드읽을때 편의성을 위해서라면 할말은 없지만요.
    • JustStudy
      고맙습니다
    • 김커피
      파이썬의 경우 get, set 메소드를 통하지 않고, 직접 인스턴스 변수에 접근하는 것을 막을 수 있는 방법은 없나요?
      질문하려고 쓰고 있는 도중에 강의에서 딱 그 내용이 나오네요. 막을 수 없다고 ㅜㅜ 정녕 막을 방법은 없는건가요??
      파일이 커지거나 여러 사람과 협업하는 경우라면, 그런 직접적인 접근을 원천 차단할 수 있다면 좋을텐데 말이죠...
      (수정이 안되서 새로 달았어요 ㅜㅜㅋ)
      ///
      아이고 5강에 바로 나오네요 ㅋㅋ 너무 성급하게 질문올렸군요 ㅎㅎ
      이고잉님 항상 강의 감사합니다!!
      대화보기
      • 김커피
        파이썬의 경우 get, set 메소드를 통하지 않고, 직접 인스턴스 변수에 접근하는 것을 막을 수 있는 방법은 없나요?
        질문하려고 쓰고 있는 도중에 강의에서 딱 그 내용이 나오네요. 막을 수 없다고 ㅜㅜ 정녕 막을 방법은 없는건가요??
      • 해앵인
        파이썬은 읽기,쓰기 허용범위 구분이 불가능한가요?
      • That Perfect
        다 좋은데...
        유튜브 버퍼링이 너무 심한데
        다음 tvpot 에도 같이 올려주시면 좋을거 같아요 ㅠ

        유튜브도 와 tvpot 같이 올려주시고
        오픈튜토리얼에는 tvpot 으로 동영상을..

        너무 버퍼링이 너무 심해요. ㅠ
      • user0123
        아니 이렇게 완벽한 강의를 다봣나;;
        돈주고 산 강의보다 더 좋으면 어떻게요 ㅠㅠ
        진짜 최고옵니다. 짱!
      • 이웃집토토로
        으.. 다시...
      • Hyeong
        python은 원래부터 c1.v1처럼 사용가능 한 것 아니었나요??
        대화보기
        • 박현재
          ㅎ ㅏ.... 슬슬 너무 어려워지긴하네요 ㅠ_ㅠ 설명을 참 잘해주시려고 노력하는데

          듣는이인 저는 머리가 나빠서그런지 객체쪽 시작되면서부터 집중력이 흐트러지는 부분도 있네요 ㅠㅠ

          저는 파이썬을 주로 공부하기 위해 수업을 듣고 있는데요, 루비랑 와따가따 하다보니.. 지금 이런 난이도에서는

          루비꺼랑 같이 설명을듣다보니 더욱 복잡해지는 부분이 있네요 ㅠ_ㅠ

          그래도 많이 도움 받고 있습니다~!!! 감사합니다!!
        • JunHo Kim
          python 2.6 부터
          getter 는 @property
          setter 는 @value.setter
          를 사용 합니다. 이걸 사용 하면 c1.getV1 이 아니고 c1.v1 처럼 사용 가능 합니다. c1.v1 = 'one' 무시 하는거도 @v1.setter 에서 로직을 넣어서 걸러 낼 수 있습니다.

          추가로 deleter 도 있습니다.

          자세한 건 문서 참고
          https://docs.python.org......tml
          https://docs.python.org......tml
        • protorenaissance
          propery >> property
        • Frank
          고맙습니다. ^^
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기