본문 바로가기
Python

0707 python class

by 대금부는개발자 2021. 7. 7.
SMALL

 

#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입니다.

 

LIST

'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

댓글