[생활코딩] 파이썬 객체와 변수, 상속, 클래스 멤버 요약본
in Development on Python
생활코딩 강의를 보고 파이썬의 객체와 변수, 상속, 클래스 멤버 요약하려 한다.
인스턴스 변수의 특성
- 파이썬은 클래스 바깥에서 인스턴스 변수를 직접 가져올수 있음(루비는 안됨)
- 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
- 파이썬 수정 불가능 하게 바꾸는 방법 : 이름을 언더바 두개
__
를 앞에 넣으면 된다. 그러면 밖에서는 접근할 수 없다.
- Ruby 수정 가능 하게 바꾸는 방법 :
상속
클래스를 상속하면 된다.
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