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. 성현아빠
    완료
  2. 최우진
    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
          모든 언어가 자기만의 개성이 있으니까요. 그 개성에 익숙하면 다른 개성은 또 불편할수도 있는거죠. 자연스럽습니다. 다만 다른 개성에 익숙한 사용자들은 섭섭함을 느낄 수 있니까요. 그것만 조심하시면 비평은 언제나 좋은거죠 ^^
          대화보기
          • 국제표준규격
            Luna님 말씀듣고 깜짝 놀라 제 덧글을 살펴보니 제 덧글에 우선 문제가 많았군요. 지금은 이미 파이썬에 푹 빠져 행복한 날들을 보내고 있습니다.

            문법에도 완전히 익숙해졌고 Luna님이 말씀하신것처럼 데이터 크롤링과 빅데이터 분석에도 초강력한 힘을 발휘하고 있습니다. 정말 매력적인 언어입니다. tensorflow 접근 언어이기도 해서 다음 달쯤에는 데이터분석을 넘어 기계학습 인공지능 분야로 넘어갈 수 있을 것 같습니다.

            그만큼 학습 속도가 굉장한 언어입니다. 그 동안 쌓아왔던 게임 알고리즘 라이브러리들을 최근 파이썬으로 컨버팅하고 있습니다.

            먼저 적었던 제 덧글이 무례했던 점 모두에게 미안합니다. 부끄럽지만 지우지는 않겠습니다. 그런데 빅데이터 처리에 자바도 많이 쓰이나요? 이 부분은 몰랐었네요. r과 파이썬 정도만 알고 있었습니다. 저도 13년차 게임 개발자입니다. 개발했던 게임들이 유명한게 많아서 욕먹을까봐 밝히지 못하겠네요 ㅋ

            언어에 대한 집착은 없습니다. 이미 사용하고 있는 언어가 양손가락을 넘어가니까요. 다만 그 중에서도 파이썬이 저에게는 첫인상이 강했던 것 같습니다. 그리고 저 덧글 적은 날이 파이썬 처음 시작한 날입니다. 다시한번 미안합니다. 글 마칠께요.
          • 국제표준규격
            대화보기
            • LUNA
              이해할 수 없는 이유는 님이 우물안의 개구리이기 때문입니다^^, 과학계, 데이터 과학, 빅테이터에서는 java 다음으로 많이 쓰는게 python입니다. 자신이 알고 산것만이 진리라는 것마냥. 고리타분한 안경은 벗으시길! 고인물에선 썩은 내가 나기 마련입니다^^
              대화보기
              • Oracle
                실무경력 13년차이고 오라클회사에 다니고 있습니다.
                언어에 집착하는 것은 별로 좋지 않은 것 같습니다. 각자 환경이 다르겠지만 pre-sales 하는 사람에게는 언어를 뛰어넘어서 프로그램 개발/시연 시간이 빠른 언어가 좋을 수 있습니다.

                C, Java, C#의 장단점을 알고 상황에 맞는 프로그램을 해야겠지요.
                닭잡는 곳에 소잡는 칼을 쓰면 불편하듯이...
              • 감사합니다.
              • 국제표준규격
                C나 C++, java, C# 언어만 쓰다가 웹개발을 위해 처음 javascript로 넘어왔을 때는 좀 어색하긴 했어도 무난히 적응할 수 있었는데 지금 보고 있는 python이나 ruby는 진짜.. 거지 같습니다. 파이썬 익히기 전에 파이썬이 간결하고 배우기 쉬운 언어라고 들었는데, 기존 문법들에 익숙한 저에게는 그냥 거지 같네요. 매우 거지 같습니다. this 안쓰려고 매개변수 저렇게 쓰는 것도 이상하고 변수 선언 안하고 쓰는 것도 똥싸고 안닦은 것 같고 변수형도 난잡하기 이를데 없고 클래스 매서드도 대체 저게 뭐야ㅜ switch case없는 것도 방금 알았는데 아, 정말..뛰어쓰기로 {}를 대신하는 것도 readable하기보단 unreadable하네요. 문장 끝에 ;넣지 않는 것도 코풀고 안닦은 것 같고.. 아! 옛날 gw-basic 수준이에요. 어떻게 이런 언어들이 인기를 끌고 라이브러리들이 많은 건지, 당췌 이해할 수가 없습니다.
                대화보기
                • JustStudy
                  여기까지로 보았을때는 Python보다는 Ruby가 구조면에서 더 체계적으로 느겨집니다.
                  고맙습니다
                • JustStudy
                  고맙습니다
                • 해앵인
                  클래스변수는 클래스 범위에서 동작하기 때문에 한번 초기화되면 그 이후부터는 초기화되지 않는다고 보는게 맞는 것 같아요!
                  대화보기
                  • yelpann@gmail.com
                    같은 의문이 듭니다
                    대화보기
                    • 열정과 함께
                      루비에서 클래스를 정의할 때

                      @@Variable1 = 0

                      이렇게 해 버리면 클래스를 정의할 때마다 @@Variable1= 0 이 부분이 실행되면서 클래스 변수가 계속 초기화되는 게 아닌가요? 아니면 저 부분은 처음에 클래스 원형이 정의될 때만 실행되고 이후의 부분에서는 실행되지 않는건가
                    • 구묵
                      보면 볼수록 재미있네요! c포자였는데 ㅎㅎ 파이썬은 적용도 쉽고 매력이 넘치는 것 같습니다!
                    • ssmktr
                      파이썬에는 동적할당을 할수가 없나요?
                    • Jaeyoon Kim
                      질문이 있습니다. 파이썬의 장식자함수는 바로 아래 이어서 오는 함수 하나에만 영향을 주는 건가요?
                    • Frank
                      고맙습니다. ^^
                      여기까지 잘 따라 가고 있습니다.
                    • jade
                      수업 잘봤습니다.
                      Python에서 문자열 안에 변수 표현하는게 C언어의 그것과 비슷하네요
                    버전 관리
                    egoing
                    현재 버전
                    선택 버전
                    graphittie 자세히 보기