class 클래스이름:
def 메서드(self):
return 코드
ex)
class Person:
def greeting(self):
print('hello')
james = Person() #james는 클래스에 속해있다.(클래스에 있는 함수 사용가능)
>>>james.greeting()
hello
a=Cookie()를 예를 들어 설명하자면
a는 객체이고 a는 Cookie의 인스턴스이다.
결론적으로 a하나만 보고 얘기를 할 때는 객체라는 표현이 맞는 말이고
Cookie 기준에서 얘기를 하면 a는 Cookie의 인스턴스라는 표현이 맞는 말이다.
class Cal:
def setdata(self,first,second):
self.first = first
self.second = second
def add(self):
return self.first + self.second
def mul(self):
return self.first * self.second
def sub(self):
return self.first - self.second
def div(self):
return self.first / self.second
a = Cal() #a를 Cal()의 멤버로 껴주기
a.setdata(4,2) #4랑 2로 데이터 맞춰놓을게!
a.add() #설정 해놓은 값으로 더하기 할게!
6
a.mul() #설정 해놓은 값으로 곱하기 할게!
8
근데 쓰다보니까.. 무지하게 귀찮다.
한번 할때도
a = Cal()
a.setdata(4,2)
이걸 계속 설정 해줘야 되다니..
더 간단하게 사용 할 수 있는 방법 없을까??!
생성자를 사용해보자!
생성자를 사용하면 객체가 생성되는 시점에 자동으로 호출이 되기 때문에 번거로움을 조금이나마 줄일 수 있다!
class Cal:
def __init__(self,first,second): #setdata를 __init__으로만 바꿨을 뿐..
self.first = first
self.second = second
def add(self):
return self.first + self.second
def mul(self):
return self.first * self.second
def sub(self):
return self.first - self.second
def div(self):
return self.first / self.second
a = Cal(4,3)
a.add()
7
a.mul()
12
이렇게만 하면 신세계가 펼쳐진다.
코드를 한줄 줄일 수 있어 더욱 읽기 쉬운 코드를 만들어 낼 수 있다!
내가 엄마 아빠 밑에서 태어나 엄마 아빠와 닮은 점이 있듯이
코드도 상속을 받는다.
class Morecal(Cal):
pass
이렇게만 적어도 아까 내가 땀 뻘뻘 흘려 적었던 Cal의 메서드 함수를 다 갖고 온것..!
상속은 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않을 때 아주 유용하게 쓸 수 있다.
그럼 심심한데 아까 Cal 클래스에서 제곱을 추가 할 수 있는 클래스를 만들어 볼까?
class Morecal(Cal):
def pow(self): #생성자 마저 부모 클래스에 있기 때문에 안써도 됨!!
return self.first ** self.second
a = Morecal(4,2)
a.add()
6
a.mul()
8
a.pow()
16
이렇게 기존 클래스에 추가하여 새로운 클래스를 생성 할 수있다!!
오버라이딩 이라고 하면 뭔가 있어보이지만... 별거 아니였다.
별 것 아닌만큼 덮어쓰기 라는 표현이 뭔가 나한테는 더 확 와닿는다.
기존 Cal 클래스에서 self.first가 4이고 self.second가 0인 상태에서 나눗셈을 진행한다면??
파이썬은 융통성이 없어 오류가 발생 한다..
이러한 오류가 있는 메서드를 보완하고 다시 만드는 것을 오버라이딩 이라고 한다.
쉽게 말하자면 카톡 구 버전(ver1.0.2)에서 개발자들이 오류를 발견하고
고친 후에 신 버전(ver1.0.3)으로 사용자들이 업데이트 하는 느낌 일까?
클래스 이름은 새로 바꾸되(카톡도 버전이름이 새로 바뀌듯이) 문제가 있는 부분만 수정하면 된다.
class SafeCal(Cal):
def div(self):
if self.second == 0:
return 0
else
self.first / self.second
a = SafeCal(4,0)
a.div()
0
이렇게 보완할 수 있다!
인터넷에서 떠돌아 다니는 코드를 보다보면 위와 같은 코드를 참 많이 보게 된다.
무슨 의미 일까?
먼저 답 부터 말하자면 현재 스크립트 파일이 프로그램의 시작점인지를 판가름 하는 의미이다.
일단 코드 하나를 예로 들겠다.
#mod2.py
def add(a,b):
return a+b
def sub(a,b):
return a-b
if__name__ =="__main__":
add(1,4)
sub(4,2)
이것을 그대로 실행 시키면?!
5
2
이렇게 결과값이 나온다.
하지만! 이것을 저장 시키고
다른 모듈에서 mod2를 불러온다면?
from mod2 import *
add(1,2)
sub(6,3)
결과값은
3
3
이 나온다.
즉,if__name__ == "__main__": 이 친구의 의미는
내가 시작점이면 내 밑에 꺼를 실행해줘, 시작점이 아니라면 내가 정의(def)한 것만 사용해줘
라는 의미로 해석 할 수 있다!
형식이 모듈과 많이 흡사하다.
import 패키지.모듈
import 패키지.모듈1, 패키지.모듈2
패키지, 모듈, 변수
패키지, 모듈, 함수()
패키지, 모듈, 클래스()
이러한 형식들도 있고
from 패키지.모듈 import 변수
from 패키지.모듈 import 함수
from 패키지.모듈 import 클래스
from 패키지.모듈 import 변수, 함수, 클래스
from 패키지.모듈 import *
.(온점)을 '~안에'로 해석 하면 쉬울 것 같다.
ex) 패키지 안에 모듈 / 패키지 안에 모듈 안에 함수 / 패키지 안에 모듈안에 클래스