[생활코딩] 파이썬 객체와 변수, 상속, 클래스 멤버 요약본


생활코딩 강의를 보고 파이썬의 객체와 변수, 상속, 클래스 멤버 요약하려 한다.

인스턴스 변수의 특성

  • 파이썬은 클래스 바깥에서 인스턴스 변수를 직접 가져올수 있음(루비는 안됨)
  • getValue(가져온다), setValue(설정한다) 을 암시하는 코드(네이밍 컨벤션) : set get 메소드라고 한다.(Ruby만 이렇게 하고 Python은 따로 있다.)
  • isinstance : 인스턴스의 타입이면 True
  • 아래 코드 설명 : set을 할껀데 int가 아니면 set하지 못하게 해라.
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
c1 = Cal(10,10)
print(c1.add())
print(c1.subtract())
c1.setV1('one')
c1.v2 = 30
print(c1.add())
print(c1.subtract())

속성

정리 : 파이썬은 외부에서 class 안의 메소드 안의 변수를 접근하거나 바꿀 수 있는데 만약에 그걸 불가능하게 만들고 싶다면 변수명 앞에 __를 붙여주면 됨.

  • Ruby : c1.value => 불가능 => 가능
  • Python : c1.value => 가능 => 불가능
  • 외부에서 접근 가능한 변수를 파이썬은 property 루비는 attribute
    • Ruby 수정 가능 하게 바꾸는 방법 : attr_reader :value, attr_writer :value, attr_accessor :value
    • 파이썬 수정 불가능 하게 바꾸는 방법 : 이름을 언더바 두개 __를 앞에 넣으면 된다. 그러면 밖에서는 접근할 수 없다.

상속

클래스를 상속하면 된다. class 클래스명(상속할 클래스) 라고 쓰면 된다.

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
class CalMultiply(Cal):
    def multiply(self):
        return self.v1*self.v2
class CalDivide(CalMultiply):
    def divide(self):
        return self.v1/self.v2
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())

클래스 멤버

  • 클래스 변수(멤버) : 모든 인스턴스가 공유하는 데이터를 담는 변수
  • 인스턴트 변수(멤버) : 객체에 의해서 변경이 가능한 데이터의 변수
  • 클래스 매소드는 @classmethod메소드명(cls)를 써준다.
  • 클래스 매소드는 첫번째 인자 cls를 넣어줘야한다.(cls = 클래스명 효과)
  • 클래스 변수는 인스턴스에 공유되는 변수
  • 메소드 안에서 class에 접근하려면 class명.을 써야하고, class변수는 메소드 안에 쓰면 안된다.
class Cs:
    count = 0 # class 변수
    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())

클래스 맴버의 활용 (Python)

  • 아래 코드를 정리해 보자면, %d와 %로 출력값 정해줬고, c1과 c2 인스턴스에서 매소드를 돌면서 _history에 리스트 형태로 쌓이다가 마지막의 Cal.history()을 입력함으로써 class mathod를 불러서 값을 도출시킨다.
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() # append 했기때문에 전체 정보가 다나온다.

참고 : 생활코딩-Python&Ruby




© 2018. by statssy

Powered by statssy