일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- flask
- S3
- lambda
- SAA
- NeXT
- 카톡
- Props
- 파이썬
- 채팅
- 중급파이썬
- MongoDB
- Vue
- SSA
- crud
- async
- socket io
- dict
- git
- pandas
- react
- Class
- EC2
- RDS
- docker
- AWS
- TypeScript
- merge
- node
- wetube
- 튜플
- Today
- Total
초보 개발자
23강 클래스와 객체의 본질 본문
[객체 안에 변수가 만들어 지는 시점]
클래스 : 객체를 만들기 위한 일종의 설계도
객체 : 클래스를 기반으로 만들어진 실제 사물
위의 정의가 일반적인 클래스와 객체의 정의이다.
그런데 파이썬의 클래스와 객체는 조금 독특한 부분이 있다.
파이썬의만의 유연함이 있다.
class Simple:
def seti(self, i):
self.i = i
def geti(self):
return self.i
클래스의 기본 정의는 다음과 같다.
클래스 내에 들어갈 변수와(데이터와) 메소드를(기능을) 결정하는 것
그런데 위의 클래스에는 메소드의 정의만 존재한다. 즉 변수의 선언은 존재하지 않는다. 그러나 파이썬은 객체에 필요한 변수를 알아서 생성해준다. 그리고 객체내에 변수가 생성되는 시점은 다음과 같다.
s1 = Simple()
s1.seti(200) # 이 메소드의 실행 과정에서 객체 내에 변수 i가 만들어 진다.
s1.geti()
200
Simple()을 통해 객체가 만들어 지고 그 안에 메서드가 2개 (seti, geti)가 존재하지만!! 호출이 일어나지 않은 시점에서는 변수가 생성되지 않는다. seti를 호출한 시점이 되서야 i라는 변수가 생성이 되는 것이다.
다시 말하면
seti 메소드를 호출하면 그 안에서 self.i = i 가 실행이 되면서 객체 내에 변수 i가 만들어 진다.
그러나 다음과 같이 geti메소드를 먼저 호출해 버리면 이 때는 오류가 발생한다. 그 이유는 아직 변수는 만들어 지지 않은 상태인데 그걸 참조하려고 하기 때문
그럼 어떻게 해야 오류가 안날까??
클래스를 만드는 모범적인 예는 아래와 같다.
class Simple:
def __init__(self):
self.i = 0 # 변수 초기화, 이 순간에 변수 i가 만들어짐
def seti(self,i):
self.i = i
def geti(self):
return self.i
__init__은 객체 생성과정에서 자동으로 호출이 되는 메서드이다.
인스턴스 변수를 모두 다 초기화를 시켜줌으로써 한 눈에 확인할 수 있고 오류를 없앨 수 있다.
이로인해 생성되는 동시에 변수가 생성이된다. (전에는 seti를 호출할 때 만들어 졌음)
[객체에 변수와 메소드를 붙였다 떼었다 해보기]
파이썬의 객체에는 변수와 메소드를 붙이기도 하고 떼기도 할 수 있다.
class SoSimple:
def geti(self):
return self.i
ss = SoSimple()
ss.i = 14
print(ss.geti())
위의 클래스는 __init__메서드 및 i를 생성하는 메서드가 존재하지 않기때문에 geti를 호출하면 오류가 발생한다.
하지만 객체를 생성하고 그 인스턴스안에 i라는 변수를 직접 만들어주면 신기하게 오류가 발생하지 않는다.
당연한 말이지만 만약 저기서 ss.i(변수이름이 i)가 아닌 ss.y 같은 다른 변수로 할당하면 오류가 난다.
이렇듯 변수 i를 추가했기 때문에 이어서 geti 메소드를 호출할 수 있었다.
ss.hello = lambda : print('hi')
ss.hello()
위의 예에서는 람다식을 기반으로 만든 함수를 hello라는 이름으로 객체에 추가하였다, 이렇듯 객체에는 함수도 추가할 수 있다.
del ss.hello
del ss.i
이러한 코드를 실행하면 앞서 추가했던 i와 hello를 객체에서 삭제하는 코드이다.
이건 __init__생성자를 통해 기본초기화 해놨던 변수라도 사라진다.(우리가 따로 추가했기때문에 지워지는 것이 아니라는 말임) 즉, del은 인스턴스 변수,메서드를 삭제하는 기능이다.
[클래스에 변수 추가하기]
앞서 객체에 변수를 추가해 보았는데, 이와 유사하게 파이썬에서는 클래스에도 변수를 추가할 수 있다.
class Simple:
def __init__(self):
self.i = 0
def geti(self):
return self.i
s = Simple()
Simple.n = 7
이건 Simple이라는 클래스 자체에 변수를 생성한 것이다. 이걸 생성했다고 해서 인스턴스안에 n이라는 변수가 할당이 되는 건 아니다.
만약 s.n을 하면 먼저 s(인스턴스 변수)안에 n이라는 변수가 있는지 확인을 하고 없다면 클래스의 변수안에 n이 있는지 확인하고 있다면 그 변수를 호출한다. 따라서 클래스에 변수 할당하기 전 생성한 s지만 s.n을 print하더라도 값은 나오는데 이러한 이유 때문이다.
'클래스에 속하는 변수를 만들 수 있다.'
'객체에 찾는 변수가 없으면 해당 객체의 클래스로 찾아가서 그 변수를 찾는다.'
파이썬의 클래스는 클래스이다 객체이기 때문에 변수를 추가할 수 있는 것이다.
클래스는 type이라는 클래스의 객체이다.
Simple2 = Simple
Simple()
Simple2()
따라서 이렇게 변수로 클래스를 참조하여 생성하는 것도 가능하다.
'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글
26강 스페셜 메소드 (0) | 2022.01.18 |
---|---|
24강 상속 (0) | 2022.01.18 |
22강 메소드 기반 문자열 조합 (0) | 2022.01.17 |
21강 표현식 기반 문자열 조합 (0) | 2022.01.17 |
20강 enumerate와 문자열 비교 (0) | 2022.01.17 |