#Class 첫 글자 대문자 해주세요
클래스 내부에 들어가는 것은 함수가 아니라 메소드라 불러요
# __init__(self) = init = initializer - instance가 생성될 때 초기화를 담당
self에는 메모리 주솟값이 가지고 있어요(instance의 시작 주소)
self 뒤엔 초기화 값
class Car(object):
my_variable = 100 #class variable
#class variable은 instance 별로 변수 공간이 따로 잡히지 않아요!
#instance가 해당 변수를 공유하는 개념으로 사용돼요!
def __init__(self,maker,cc,price):
self.maker = maker # = maker :property(속성) -instance variable
self.cc = cc
self.price = price
# instance의 의미는 각각 instance 가 독립적으로 가지고 있기 때문에 이런 표현을 써요
def print_car_info(self): # self = isntance method
print(self.maker, self.cc, self.price)
print(Car.my_variable)
# class variable은 class 이름이 붙고 isntance variable 은 self라는 키워드를 써야 해요.
# class를 기반으로 heap 영역에 메모리 공간을 할당할 수 있어요!
# 이 확보된 메모리 공간 자체를 instance라고 해요 = 객체(object)
car_1 = Car('현대',2000,2000)
car_1.print_car_info()
car_2 = Car('현대',3000,3000)
#car_1 cc , car_2 cc는 같은 변수가 아니에요는 같은 변수가 아니에요(별개의 공간)
#car_1
# car_1과 car_2 안에는 해당 인스턴스의 시작 메모리 주 솟값이 들어있어요.
# 일반적으로 이런 변수들을 가리켜서 reference variable
# 하지만 프로그래밍할 때는 심플하게 car_1이 객체, car_2가 각체
# 객체가 있다는 얘기는 class가 있다는 말이에요
#모든 객체는 기본적으로 변수(property)를 가지고 있고, 함수(method)를 가지고 있어요.
#이런 객체가 가지는 property와 method를 사용하기 위해서 우리가 이용하는 연산자가 있어요
#→. (dot operator)
#A. B A는 객체, B는 변수(property) 함수가 되려면 ()가 있어야 해요
#A.B,C .(dot operator) 을 기준으로 앞과 뒤를 봐야 해요. A.B 는 객체 C는 변수(property)
# python의 객체지향의 특징
#instance에 새로운 property 나 method를 동적으로 추가할 수 있어요.
(다른 언어에서는 안돼요)
car_1.color = '레드'
#객체지향과는 살짝 거리가 있는 특징이에요.
#이런 특징은 프로그램을 상당히 유연하게 작성할 수 있게 만들어 줘요
#여기에서 발생할 수 있는 문제가 하나 있어요! - Scope 문제
car_2 = Car('기아',3000,4000)
#car1는 nstance variable 4개 class variable 1개 (color까지)
#car2는 instance variable 3개 class variable 1개
#Scope 문제가 있어요!
#변수를 찾는 순서 →인스턴스 namespace > 클래스 namespace > 슈퍼클래스 namespace
car_1.my_variable = 300 #class variable을 수정하지 않아요. instance namespace에
#새로운 instance variable을 추가해요!
car_2.print_car_info() #결과가 어떻게 나오나요?
현대 2000 2000
100
기아 3000 4000
100
새로운 연봉 인상률에 관한 클래스 만들어 봐요!
class Employee(object):
raise_rate = 1.1 #class variable(연봉 인상률)
def __init__(self,u_name,u_pay, u_mobile):
self.u_name = u_name
self.u_pay = u_pay #2개의 instance variable
self.__u_mobile = u_mobile #__를 property 앞에 붙이면 private로 동작
#business method(instance method)로직에 관한 일반 메소드
def apply_raise(self):
self.u_pay = self.u_pay * self.raise_rate
def get_user_info(self):
return "현재 {}의 연봉은 {}입니다.".format(self.u_name, self.u_pay)
#파이썬에서 문자열은 객체. format()은 메소드
#decorator를 이용해서 class method를 정의해야 해요.
@classmethod
def chang_raise_rate(cls, rate): #클래스가 가지고 있는 변수를 제어 (cls) 메모리상 위에
cls.raise_rate = rate class Employee 지칭
print('인상률이 {}으로 조정되었습니다.'.format(rate))
@staticmethod
def my_func():
emp_1 = Employee('홍길동', 1000)
emp_2 = Employee('강감찬', 3000)
#연봉 인상 전 두 사람의 정보를 출력하고 싶어요
print(emp_1.get_user_info())
print(emp_2.get_user_info())
#연봉 인상률을 변경해요
Employee.chang_raise_rate(1.3)
# emp_1 의 연봉을 인상할 거예요!
emp_1.apply_raise()
# 연봉 인상 후 두 사람의 정보를 출력
print(emp_1.get_user_info())
print(emp_2.get_user_info())
emp_1.u_mobile = '010 -4444-5555' #이런코드 사용하지 못하도록 강제할 수 없나요?
#__를 property 앞에 붙이면 private로 동작
#property를 direc로 엑세스 하지 않는게 좋아요
현재 홍길동의 연봉은 1000입니다.
현재 강감찬의 연봉은 3000입니다.
인상률이 1.3으로 조정되었습니다.
현재 홍길동의 연봉은 1300.0입니다.
현재 강감찬의 연봉은 3000입니다.
'Python' 카테고리의 다른 글
| 0707 Python Module (0) | 2021.07.07 |
|---|---|
| 0707 python 상속 (0) | 2021.07.07 |
| 0702 class 3 , dir(),__init__, magic method (0) | 2021.07.02 |
| 0702 class 2 (0) | 2021.07.02 |
| 0702 class (0) | 2021.07.02 |
댓글