아. 드디어 객체지향까지 왔구나
(참고 https://wikidocs.net/85 , https://wikidocs.net/28 )
객체와 인스턴스의 차이
클래스에 의해서 만들어진 객체를 인스턴스라고도 한다.
그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각 해 보자.
cat = Animal() 이렇게 만들어진 cat은 객체이다.
그리고 cat이라는 객체는 Animal의 인스턴스(instance)이다.
즉 인스턴스라는 말은 특정 객체(cat)가 어떤 클래스(Animal)의 객체인지를 관계위주로 설명할 때 사용된다.
즉, "cat은 인스턴스" 보다는 "cat은 객체"라는 표현이 / "cat은 Animal의 객체" 보다는 "cat은 Animal의 인스턴스" 라는 표현이 훨씬 잘 어울린다.
클래스안에서 함수 선언
클래스안에서 함수 선언시, self 라는 변수를 클래스 함수의 첫번째 인자로 받아야 한다.
클래스내의 함수의 첫번째 인자는 "
(참고 https://wikidocs.net/85 , https://wikidocs.net/28 )
객체와 인스턴스의 차이
클래스에 의해서 만들어진 객체를 인스턴스라고도 한다.
그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각 해 보자.
cat = Animal() 이렇게 만들어진 cat은 객체이다.
그리고 cat이라는 객체는 Animal의 인스턴스(instance)이다.
즉 인스턴스라는 말은 특정 객체(cat)가 어떤 클래스(Animal)의 객체인지를 관계위주로 설명할 때 사용된다.
즉, "cat은 인스턴스" 보다는 "cat은 객체"라는 표현이 / "cat은 Animal의 객체" 보다는 "cat은 Animal의 인스턴스" 라는 표현이 훨씬 잘 어울린다.
클래스안에서 함수 선언
클래스안에서 함수 선언시, self 라는 변수를 클래스 함수의 첫번째 인자로 받아야 한다.
클래스내의 함수의 첫번째 인자는 "
무조건! self
로 사용해야 인스턴스의 함수로 사용할수 있다" 를 기억하자.
[lhr@tpl-master python]# vim oop.py
#!/usr/bin/python
class Singer:
branch = 'JYP'
[lhr@tpl-master python]# vim oop.py
#!/usr/bin/python
class Singer:
branch = 'JYP'
def
setname
(self,
name):
self.name = name
self.name = name
def sing(self,
title):
return 'Song Title is '+ title , 'and singer name is '+ self.name
# god 객체라는 표현이, god는 Singer의 인스턴스라는 표현이 맞다.
god = Singer()
god.
return 'Song Title is '+ title , 'and singer name is '+ self.name
# god 객체라는 표현이, god는 Singer의 인스턴스라는 표현이 맞다.
god = Singer()
god.
setname
('god')
print god.sing('sorry') , 'Branhch is ', god.branch
jingoo = Singer()
jingoo.
print god.sing('sorry') , 'Branhch is ', god.branch
jingoo = Singer()
jingoo.
setname
('Jin-Ju')
print jingoo.sing('happy') , 'Branhch is ', jingoo.branch
## 아래는 둘다 동일한 결과를 얻는다.
## imjunghee.sing('bla') 라고 호출하면, self는 호출시 이용했던 인스턴스로 바뀌게 된다.
## 전자 보다는
print jingoo.sing('happy') , 'Branhch is ', jingoo.branch
## 아래는 둘다 동일한 결과를 얻는다.
## imjunghee.sing('bla') 라고 호출하면, self는 호출시 이용했던 인스턴스로 바뀌게 된다.
## 전자 보다는
후자의
방법이 쓰기도 쉽고, 보기도 쉽다.
imjunghee = Singer()
imjunghee.
imjunghee = Singer()
imjunghee.
setname
('Jung-Hee')
print
Singer.sing(imjunghee, 'music')
, '\t' ,
imjunghee.sing('music is my life')
_init_ 이란 무엇인가?
인스턴스를 만들때 항상 실행된다. ( 생성자다. )
__del__ 메소드, 객체가 사라질때 호출된다.
소멸자다.
아래 실행 예를 보면,
Traceback (most recent call last):
File "singer.py", line 15, in<module>
인스턴스를 만들때 항상 실행된다. ( 생성자다. )
__del__ 메소드, 객체가 사라질때 호출된다.
소멸자다.
아래 실행 예를 보면,
Traceback (most recent call last):
File "singer.py", line 15, in<module>
god = Singer()
TypeError: __init__() takes exactly 2 arguments (1 given)
shell returned 1
Press ENTER or type command to continue
#!/usr/bin/python
class Singer:
branch = 'JYP'
Press ENTER or type command to continue
#!/usr/bin/python
class Singer:
branch = 'JYP'
def __init__(self, name):
self.name = name
def sing(self, title):
return 'Song Title is '+ title , 'and singer name is '+ self.name
return 'Song Title is '+ title , 'and singer name is '+ self.name
# def setname(self, name):
# self.name = name
god = Singer()
#god.setname('god')
print god.sing('sorry') , 'Branhch is ', god.branch
imjunghee = Singer()
#imjunghee.setname('Jung-Hee')
print Singer.sing(imjunghee, 'music') , '\t' , imjunghee.sing('music is my life')
다음과 같이 객채를 생성할때 선언해주어야 한다.
->god = Singer('GOD')
class Singer:
branch = 'JYP'
다음과 같이 객채를 생성할때 선언해주어야 한다.
->god = Singer('GOD')
class Singer:
branch = 'JYP'
def __init__(self, name):
self.name = name
def sing(self, title):
return 'Song Title is '+ title , 'and singer name is '+ self.name
return 'Song Title is '+ title , 'and singer name is '+ self.name
# def setname(self, name):
# self.name = name
god = Singer('GOD')
#god.setname('god')
print god.sing('sorry') , 'Branhch is ', god.branch
imjunghee = Singer('Jung-Hee')
#imjunghee.setname('Jung-Hee')
print Singer.sing(imjunghee, 'music') , '\t' , imjunghee.sing('music is my life')
클래스의 구조
상속할 클래스가 있다면, () 안에 상속할 클래스 이름을 쓴다.
클래스 내부에는 클래스변수와 클래스 함수가 있다.
class 클래스이름[(상속 클래스명)]:
<클래스 변수 1><클래스 변수 2>
...
def 클래스함수1(self[, 인수1, 인수2,,,]):
<수행할 문장 1><수행할 문장 2>
...
def 클래스함수2(self[, 인수1, 인수2,,,]):
<수행할 문장1><수행할 문장2>
...
...
사칙연산을 수행하는 클래스 만들어보기.
실행한 결과다.
sample.x : 10 sample.y : 2
SUM : 12 MINUS : 8 MUL : 20 DIV 5.0 NAM : 0.0
클래스의 구조
상속할 클래스가 있다면, () 안에 상속할 클래스 이름을 쓴다.
클래스 내부에는 클래스변수와 클래스 함수가 있다.
class 클래스이름[(상속 클래스명)]:
<클래스 변수 1><클래스 변수 2>
...
def 클래스함수1(self[, 인수1, 인수2,,,]):
<수행할 문장 1><수행할 문장 2>
...
def 클래스함수2(self[, 인수1, 인수2,,,]):
<수행할 문장1><수행할 문장2>
...
...
사칙연산을 수행하는 클래스 만들어보기.
실행한 결과다.
sample.x : 10 sample.y : 2
SUM : 12 MINUS : 8 MUL : 20 DIV 5.0 NAM : 0.0
<type 'instance'>
<type 'classobj'>
Press ENTER or type command to continue
#!/usr/bin/python
class Calc:
def __init__(self, x, y):
self.x = x
self.y = y
def sum(self):
return int(self.x) + int(self.y)
def minus(self):
return int(self.x) - int(self.y)
def mul(self):
return int(self.x) * int(self.y)
#!/usr/bin/python
class Calc:
def __init__(self, x, y):
self.x = x
self.y = y
def sum(self):
return int(self.x) + int(self.y)
def minus(self):
return int(self.x) - int(self.y)
def mul(self):
return int(self.x) * int(self.y)
def div(self):
return float(self.x) / float(self.y)
def nam(self):
return float(self.x) % float(self.y)
sample = Calc(10, 2)
print 'sample.x :', sample.x , '\t' , 'sample.y :', sample.y
print 'SUM : ',sample.sum() , '\t', 'MINUS : ', sample.minus(), '\t', 'MUL : ', sample.mul(), '\t', 'DIV' , sample.div(), '\t', 'NAM :' , sample.nam()
return float(self.x) % float(self.y)
sample = Calc(10, 2)
print 'sample.x :', sample.x , '\t' , 'sample.y :', sample.y
print 'SUM : ',sample.sum() , '\t', 'MINUS : ', sample.minus(), '\t', 'MUL : ', sample.mul(), '\t', 'DIV' , sample.div(), '\t', 'NAM :' , sample.nam()
print type(sample)
print type(Calc)
나누기의 경우, 충분히
ZeroDivisionError
: float division Exception이 발생할수 있는 포인트다.
예외처리
방법 1
try:
...
except:
...
방법 2
try:
...except 발생에러(ex. ZeroDivisionError):
...
방법 3
try:
...except 발생에러(ex. ZeroDivisionError) as e:
print(e)
아래처럼 나누기의 경우, 예외처리를 해주는것이 바람직 하겠다.
def div(self):
try:
return float(self.x) / float(self.y)
except ZeroDivisionError , e:
print(e)
return
예외처리
방법 1
try:
...
except:
...
방법 2
try:
...except 발생에러(ex. ZeroDivisionError):
...
방법 3
try:
...except 발생에러(ex. ZeroDivisionError) as e:
print(e)
아래처럼 나누기의 경우, 예외처리를 해주는것이 바람직 하겠다.
def div(self):
try:
return float(self.x) / float(self.y)
except ZeroDivisionError , e:
print(e)
return
'파이썬' 카테고리의 다른 글
파이썬 공부하기_모듈 만들고 불러보기 ( if __name__ == "__main__" ) (0) | 2015.11.10 |
---|---|
파이썬 공부하기_클래스 (상속, 함수 오버라이딩, 연산자 + 오버라이딩) (0) | 2015.11.10 |
파이썬 공부하기_파일 다루기 (0) | 2015.11.10 |
파이썬 공부중_여러가지 import os, os.path, glob, sys, math, calendar, string, (0) | 2015.11.10 |
파이썬 연습하기 예제 공부하기_자료형(tuple, dictionary) (0) | 2015.11.10 |