반응형
이번 시간엔 생성자, 비교, 더하기 등등 클래스 내 재밌는 기능을 알아보겠습니다.
1) 생성자
이전시간에 만든 Human객체에는 power, weight, height라는 클래스변수가 있었습니다. 근데 이 클래스변수가 모든 사람마다 같을 순 없습니다.
어떤 사람은 power 수치가 높을 수 있고 weight, height역시 저마다 다를 것입니다.
이것을 아예 객체 생성할 때 쉽게 선언하는 방법이 없을까요?
생성자는 이 문제를 잘 해결해줄 수 있습니다. 이 생성자 메소드를 이용해 객체 선언과 동시에 각각의 클래스 변수를 설정할 수 있게 해주니까요.
예를 들어보겠습니다.
#생성자
class Human :
power = 100
weight = 100
height = 100
def eat(self) :
self.weight += 20
def train(self) :
self.weight -= 5
self.power += 20
def sleep(self) :
self.weight -= 5
self.height += 10
class Student(Human) :
name = '무명'
age = 100
gender = '성별'
def __init__ (self, tmp_name, tmp_age, tmp_gender) :
self.name = tmp_name
self.age = tmp_age
self.gender = tmp_gender
def study(self) :
print('공부한다')
self.power+=20
def stat(self) :
print(f'나는 {self.age}살 {self.name} ({self.gender})입니다.')
print('power :', self.power)
print('weight :', self.weight)
print('height :', self.height)
print('')
man1 = Student('김개똥', 123, '남자')
woman1 = Student('마복례', 234, '여자')
#man1의 생활과 결과
man1.eat()
man1.eat()
man1.sleep()
man1.study()
man1.stat()
#woman1의 생활과 결과
woman1.train()
woman1.train()
woman1.train()
woman1.stat()
(19행) 보시다시피 기본 클래스변수는 '무명', 100, '성별'로 설정되어있습니다.
(23행) 하지만 __init__이란 생성자를 선언해서 클래스변수를 바꿔보겠습니다.
결과는 다음과 같습니다.
2) __add__, __lt__
아주 잘 쓰이는 기능인지는 잘 모르지만 알아두면 좋을 것 같아 적었습니다.
#비교, 덧셈
class Shape :
area = 0
def __add__(self, other) :
return self.area + other.area
def __lt__(self, other) :
return self.area < other.area
a = Shape()
a.area = 15
b = Shape()
b.area = 25
print(a + b)
if( b > a ) :
print('b가 a보다 더 넓어요.')
(4행) area라는 클래스변수값을 +연산을 쓰면 더해지게끔 구현했습니다.
=>이것을 15행처럼 나타내면 __add__가 호출되면서 계산됩니다.
(7행) area의 값을 비교해서 __lt__(lt = less than, 즉 other보다 작게 나타낸 것을 return값으로 취함)함수에 맞게 나타냈습니다.
=> 17행에서 부등호 비교를 하면 __lt__가 호출되면서 참인지 거짓인지 결과가 나옵니다.
결과는 다음과 같아요.
반응형
'PYTHON' 카테고리의 다른 글
[PyCharm] pip없이도 모듈 갖고오는 방법 (0) | 2021.09.08 |
---|---|
[파이썬] 윈도우에서 pip 다운받고 pip실행해보기 (0) | 2021.09.08 |
python 클래스 - 메쏘드, 클래스 변수 (0) | 2021.09.03 |
python - 클래스(class)에 대해 알아보자(1) - 정의 및 기본 구조 (0) | 2021.09.03 |
python - 기본문법 - lambda (0) | 2021.08.31 |