Python & Ruby

클래스 맴버

클래스 맴버 소개

Ruby

require 'date'
d1 = Date.new(2000, 1, 1)
d2 = Date.new(2010, 1, 1)
p d1.year()
p d2.year()
p Date.today()

ideone.com 

클래스 메소드 (Ruby)

Ruby 

class Cs
  def Cs.class_method()
    p "Class method"
  end
  def instance_method()
    p "Instance method"
  end
end
i = Cs.new()
Cs.class_method()
i.instance_method()
#Cs.instance_method() 오류발생
#i.class_method() 오류발생

ideone.com 

클래스 메소드 (Python)

Python

class Cs:
    @staticmethod
    def static_method():
        print("Static method")
    @classmethod
    def class_method(cls):
        print("Class method")
    def instance_method(self):
        print("Instance method")
i = Cs()
Cs.static_method()
Cs.class_method()
i.instance_method()

ideone.com

클래스 변수 (Ruby)

Ruby

class Cs
  @@count = 0
  def initialize()
    @@count = @@count + 1
  end
  def Cs.getCount()
    return @@count
  end
end
i1 = Cs.new()
i2 = Cs.new()
i3 = Cs.new()
i4 = Cs.new()
p Cs.getCount()

ideone.com 

클래스 변수 (Python)

Python 

class Cs:
    count = 0
    def __init__(self):
        Cs.count = Cs.count + 1
    @classmethod
    def getCount(cls):
        return Cs.count
i1 = Cs()
i2 = Cs()
i3 = Cs()
i4 = Cs()
print(Cs.getCount())

ideone.com

클래스 맴버의 활용 (Ruby)

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
end
class CalMultiply < Cal
  def multiply()
    result = @v1*@v2
    @@_history.push("multipy : #{@v1}*#{@v2}=#{result}")
    return result
  end
end
class CalDivide < CalMultiply
  def divide()
    result = @v1/@v2
    @@_history.push("divide : #{@v1}/#{@v2}=#{result}")
    return result
  end
end
c1 = CalMultiply.new(10,10)
p c1.add()
p c1.multiply()
c2 = CalDivide.new(20, 10)
p c2, c2.add()
p c2, c2.multiply()
p c2, c2.divide()
Cal.history()

ideone.com 

클래스 맴버의 활용 (Python)

Python 

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)
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
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
c1 = CalMultiply(10,10)
print(c1.add())
print(c1.multiply())
c2 = CalDivide(20,10)
print(c2, c2.add())
print(c2, c2.multiply())
print(c2, c2.divide())
Cal.history()

ideone.com

댓글

댓글 본문
작성자
비밀번호
  1. 박혜진
    클래스 변수에 대해 질문 하나 드려도 될까요?
    생성자 수업에서 말씀하시길, 클래스에서 인스턴스가 생성될때 initialize/__init__이 가장 먼저 실행된다고 하셨던 것 같은데 클래스 변수 값 설정하는 부분이 (즉, @@count =0 과 count=0) initialize/__init__보다 먼저 읽히는 건가요? 그리고 만약 그런거라면 그 다음 인스턴스 생성시에도 클래스 변수 값 0으로 설정하는 부분이 다시 읽히면서 +1 됐던 값이 다시 0이 되어야 하는 건 아닌가요?

    늘 정말 감사하게, 그리고 감탄하면서 듣고 있습니다. 정말 감사합니다!
  2. 가재준
    완료
  3. 홍주호
    20190825 완료
  4. 허니비
    190808
  5. 얼그레이
    190607 역대급으로 어려웠던 수업 같아요! 틈틈히 복습해야겠네요 ㅎㅎ 감사합니다~!
  6. Hotak Choi
    19 05 06 !!
  7. 190503완료 감사합니다
  8. 떡이
    사랑합니다.
  9. wiseman
    190421 1630 완료
  10. 19.04.17 완료
  11. 호두
    고마븝니다
  12. 주니
    이해가 잘 되네요... 감사합니다.
  13. 김정석
    조금은 복잡하네요 !
  14. kmw8462
    감사합니다.
    다시 한번더 듣기.
  15. yareuk
    2018-12-24
  16. 루이보스라떼
    2018.12.09.
  17. 규동부리
    181204 여기까지 왔습니다!
    하루 30분 ~ 1시간!! 꾸준히 따라가겠슴다
  18. 닐반
    2018. 10. 14.
  19. 유닉스가이
    감사합니다.
  20. 해릭
    180722 감사합니다.
  21. Ji Yeoun Park
    2018.07.03 감사합니다
  22. 정병찬
    2018 06 28
    수강완료
  23. 다람쥐
    감사합니다!
  24. Jaeduk Jang
    완료했습니다. 감사합니다.
  25. 고맙습니다
    제가 공부해본 경험상 클레스 메소드와 인스턴스 메소드 구분 못하면 순간 코드 해석이 잘 안되더라구요. 정말 책으로 공부를 할 이유가 없게 만들어버리시는 영상물입니다.
  26. 코딩잘하고싶어요 ㅎ
    아니요 생략하시면 안 됩니다. 밑에서 Cal.history()로 적은 이유는 Cal 클래스에 있는 history라는 메소드를 호출하기 위해서입니다. history()와 _history는 둘 다 클래스 소속은 맞지만 각각 메소드와 어트리뷰트로 완벽히 다릅니다.

    아마 메소드 이름과 어트리뷰트 이름 간에 착오가 있으신 듯 합니다...
    대화보기
    • Heonjin Ha
      질문: 왜 Class method와 Instance method와 static method를 나누지?
      내가 생각하는 답변.
      class에서 받은 데이터와
      instance에서 받은 데이터가 다르게 동작할수 있음. 그걸 효율적으로 관리하기 위해서.
      Static method는 데이터와 관련 없는 method같음.(ㅠㅠㅠ몰라..)
      진짜 답변은 무엇인가요?
    • Heonjin Ha
      기억하기 위해 적어놉니다 :
      @한개는 instance에 들어간다.
      @@두개는 class에 들어간다.
      @가 없는것은 method안에 들어간다.
    • Heonjin Ha
      6일만에 이부분까지 왔어요.
      먼저 다른 언어를 많이 알고 있는 상태였어요.(matlab, C, R)
      새로이 알게된부분은 모듈, 객체지향밖에 없어서 빨리 들을수 있었어요.
      원동력이라 하면, 제가 python으로 하고자 하는게 있는데, 그걸 빨리 해보고싶어서 그런거같아요.
      제가 만들고자 하는건 '웹크롤링'이라는 것인데, 인터넷 찾아보시면 매우 흥미롭답니다.
      그리고, 다른 원동력으로는 친구들에게 언어를 배웠다고 자랑을 많이했어요.

      공부중님 작성자는 아니지만, 댓글 남겨봐요.
      대화보기
      • orez
        같지만 또 다른 얘기들이 반복되는 듯 하네요. 재밌어요 ^_^, 감사합니다.
      • 성현아빠
        완료
      • 최우진
        1주일만에 이부분까지 오셨다 하셔서 놀라움에 댓글 남깁니다.
        어떻게 1주일만에 이 정도의 양을 공부하신건가요?
        음 , 이렇게 열심히 하시는 이유나 원동력이 무엇인가요?
        대화보기
        • GoldPenguin
          완료했습니다.
        • 김태윤
          완료했어요
        • 봇대
          message님

          Cal._history.append("add : %d+%d=%d" % (self.v1, self.v2, result))

          이 부분을 말씀하시는 건가요? 배열에 append 되는 내용은 문자열인데 self.v1 등이 숫자이기 때문에 문자로 치환해주는 과정으로 보입니다. 즉 첫번째 %d에 self.v1이 문자로 바뀌어서 들어가는 것이라 이해했습니다.
          대화보기
          • J.Y.Oh
            어려울 수 있는 내용을 쉽게 잘 설명해주셔서 감사합니다.
          • 미림_likelion
            수강 완료했습니다. 감사합니다.
          • message
            왜 공식앞에 %를 붙였는지 의문이 들고 궁금합니다. 다른 부분은 이해가 갔는데
            저 부분이 궁금하네요
          • 공부중
            17.07.08
            파이썬 시작한지 일주일 잘보고 갑니다
          • 심화평
            _history : history앞에 _를 붙이는것은 내부에서만 사용하려고 하는것 맞나요?
            17.07.05 감사합니다.
          • 나만의 부
            2017.04.29 감사합니다~
          • 굼금메
            require 'date'
            같은 경우는 따로 date.rb 파일을 만들지 않고 함수 정의도 하지 않았는데 실행되는 건,
            date는 기본으로 method가 내장되어 있기 때문인가요???
          • 나그네
            궁금한 것이 있어서요.
            _history = [] 에서 언더바를 해준 이유가
            Cal.history.append라고 하면 history를 메서드로 인식해서 그런 것인가요?
            언더바를 없애고 실행하면
            AttributeError: 'function' object has no attribute 'append' 라고 에러 메세지가 뜨더라고요.
          • 문돌이
            ruby 클래스 변수 부분에서

            @@_history 로 변수를 선언하셨는데,

            밑에 끌어올 때는 Cal.history() 으로 적어도 되는건가요?

            _ <= 이부분은 생략해도 되는지..궁금합니다.
          • Philip Oh
            잘 봤습니다~ 감사합니다!
          • 환글
            클래스 멤버는 좀 어렵네요...
          • 개발 고수분들한테는 당연한 것이겠지만,
            제가 한가지 알게된 것 말씀드릴게요~

            전 수업중에 python에서 __를 변수명 앞에 붙여줌으로써 직접접근을 막는다고 배웠었는데요.
            제가 인자 중 v1에 __이걸 달고나서 이번 실습을 진행했었습니다.
            (환경 : 부모 class = Cal<method : add,subtract> / 자식 class = Cal_v1<method : multiply>)

            그런데.. 자식이 __v1에는 접근이 불가하더군요.
            해서 이전에 배웠던 getter를 통해 부모의 __v1값을 자식이 얻을 수 있었습니다.
            (self.__v1 = x , self.getV1() = o)

            쓰고나니 별 것 없습니다만.. 누군가에게 도움이 될 것이란 생각에 적습니다~! 열공해요 !
          • 미래의 래리 앨리슨
            와우 13년차 프로그래머분들도 egoing님 인강으로 Python을 시작한다니... 대박이네요.
          • 국제표준규격
            네. 이해해주시니 다행이네요. 고맙습니다.
            대화보기
            • egoing
              모든 언어가 자기만의 개성이 있으니까요. 그 개성에 익숙하면 다른 개성은 또 불편할수도 있는거죠. 자연스럽습니다. 다만 다른 개성에 익숙한 사용자들은 섭섭함을 느낄 수 있니까요. 그것만 조심하시면 비평은 언제나 좋은거죠 ^^
              대화보기
              버전 관리
              egoing
              현재 버전
              선택 버전
              graphittie 자세히 보기