class 02, 일급함수, modul 뜻

2021. 7. 7. 16:47python/파이썬

728x90

# python built-in data type
# 1. Numeric
#    int(정수), float(실수), complex(복소수)
# 2. Sequence
#    list, tuple, range
#    indexing, slicing
# 3. Text Sequence
#    str
# 4. Mapping
#    dictionary - dict
# 5. Set
#    set
# 6. Bool
#    True, False, bool

 

# function(함수)
# 사용자 정의 함수, 내장함수

 

# 객체지향
# class
# - 객체모델링의 수단
# - 객체(인스턴스)를 생성하기위한 단위
# - ADT(Abstract Data Type)

 

class Car(object):
    
    # initializer
    # instance가 생성될 때 초기화를 담당
    def __init__(self,maker,cc,price):
        self.maker = maker   # self.maker : property(속성) - instance variable
        self.cc = cc
        self.price = price
   

    # instance method
    def print_car_info(self):
        print(self.maker, self.cc, self.price)


# class를 기반으로 heap 영역에 메모리 공간을 할당할 수 있어요!      
# 이 확보된 메모리 공간 자체를 instance라고 해요 - 객체(object)

car_1 = Car('현대','소나타',2000)
car_2 = Car('현대','그랜저',3000)

# car_1과 car_2안에는 인스턴스의 메모리 주소값이 들어가 있어요!
# 일반적으로 이런 변수들을 가리켜서 reference variable
# 하지만 프로그래밍할때는 심플하게 car_1이 객체, car_2가 객체.

# 객체가 있다는 얘기는 class가 있다는 말이예요
# 모든 객체는 기본적으로 변수(property)를 가지고 있고, 함수(method)를 가지고 있어요
# 이런 객체가 가지는 property와 method를 사용하기 위해서 우리가 이용하는 연산자가
# 있어요 => . (dot operator)

 

 

 

 

 

 

 

 

class Car(object):
    
    my_variable = 100    # class variable
    
    # initializer
    # instance가 생성될 때 초기화를 담당
    def __init__(self,maker,cc,price):
        self.maker = maker   # self.maker : property(속성) - instance variable
        self.cc = cc
        self.price = price
   

    # instance method
    def print_car_info(self):
        print(self.maker, self.cc, self.price)

# instance variable과 instance method의 
# instance의 의미는 각각의 instance가 독립적으로 가지고 있기때문에 이런 표현을 써요

car_1 = Car('현대',2000,2000)
car_2 = Car('현대',3000,3000)

# class variable은 instance별로 변수 공간이 따로 잡히지 않아요!
# instance가 해당 변수를 공유하는 개념으로 사용되요!

# car_1.cc , car_2.cc 는 같은 변수가 아니예요(별개의 공간)
# car_1.my_variable , car_2.my_variable 는 같은 변수예요(같은 공간을 공유)

 

class Car(object):
    
    my_variable = 100    # class variable
    
    # initializer
    # instance가 생성될 때 초기화를 담당
    def __init__(self,maker,cc,price):
        self.maker = maker   # self.maker : property(속성) - instance variable
        self.cc = cc
        self.price = price
   

    # instance method
    def print_car_info(self):        
        print(self.maker, self.cc, self.price)
        print(Car.my_variable)
        
car_1 = Car('현대',2000,2000)   
car_1.print_car_info()


# python의 객체지향 특징 중 하나는
# instance에 새로운 property나 method를 동적으로 추가할 수 있어요!
car_1.color = '레드'
# 객체지향과는 살짝 거리가 있는 특징이예요. 이런 특징은 프로그램을 상당히
# 유연하게 작성할 수 있게 만들어줘요

# 여기에서 발생할 수 있는 문제가 하나 있어요!
car_2 = Car('기아',3000,4000)   

# Scope문제가 있어요!
# 변수를 찾는 순서 => 인스턴스 namespace > 클래스 namespace > 슈퍼클래스 namespace

car_1.my_variable = 300  # class variable을 수정하지 않아요. instance namespace에
                         # 새로운 instance variable을 추가해요!
car_2.print_car_info()  # 결과가 어떻게 나오나요?

 

 

class Employee(object):
    
    raise_rate = 1.1 # class variable (연봉 인상률)
    
    def __init__(self,u_name,u_pay, u_mobile):
        self.u_name = u_name    # instance variable
        self.u_pay = u_pay
        self.__u_mobile = u_mobile
        
    # 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)
    
    # decorator를 이용해서 class method를 정의해야 해요!
    @classmethod
    def change_raise_rate(cls, rate):                      #cls = class 약자
        cls.raise_rate = rate
        print('인상률이 {}으로 조정되었습니다.'.format(rate))
    
    @staticmethod
    def my_func():
        
    
    
emp_1 = Employee('홍길동',1000, '010-1234-5678')
emp_2 = Employee('강감찬',3000, '010-3334-6667')

# 연봉인상 전 두 사람의 정보를 출력
print(emp_1.get_user_info())
print(emp_2.get_user_info())

# 연봉인상률을 변경해요!
Employee.change_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으로 동작 

    

 

 

 

 

 

 

# 객체지향의 꽃 => 상속(Inheritance)

# class를 상속해서 다른 class를 확장시키는 기법
# 부모 class => parent class, super class, upper class
# 자식 class => child class, sub class

class Unit(object):
    
    def __init__(self,damage,life):
        self.damage = damage   # 공격력
        self.life = life       # 생명력
        
class Tank(Unit):     # Inheritance

    def __init__(self,damage,life,has_chain):
        super(Tank, self).__init__(damage,life)
        self.has_chain = True  # chain 유무

tank_1 = Tank(100,50,True)

tank_1.damage = 1000

 

 

 

 

 

 

# class와  instance에 대한 기본적인 사항에 대해서 알아보았어요!

# magic method
# method 이름 앞에 __ 가 붙은 method를 지칭 ( __init__(~~) )
# class안에 정의된 특수한 기능을 하고 있는 method
class Employee(object):
    
    raise_rate = 1.1 # class variable (연봉 인상률)
    
    # initializer역할(초기화의 역할)
    def __init__(self,u_name,u_pay):
        print('initializer가 호출되었어요!')
        self.u_name = u_name    # instance variable
        self.u_pay = u_pay
        
    def __del__(self):
        print('소멸자가 호출되었어요!')

    def __str__(self):
        return '소리없는 아우성!!'
        
    # business method(instance method)    
    def apply_raise(self):
        self.u_pay = self.u_pay * self.raise_rate
        
    
    
emp_1 = Employee('홍길동',1000)

print(emp_1)

 

#__lt__(self,other)  == less than


class Car(object):
    
    def __init__(self,maker,cc):
        self.maker = maker
        self.cc = cc

    def __lt__(self,other):
        if self.cc < other.cc:
            return '{}이 배기량이 작습니다.'.format(self.maker)
        else:
            return '{}이 배기량이 작습니다.'.format(other.maker)
    
car_1 = Car('현대',3000)
car_2 = Car('기아',2000)

print(car_1 < car_2)    # print(car_1.cc < car_2.cc)

 

 

 

 

 

 

 

# first class(일급)
# first-class citizen
# => 프로그래밍 개체(함수, 객체, 변수, 등등)들이 다음의 조건을 충족하면
#    기본적으로 first-class citizen이라고 합니다.
# 1. 변수에 저장될 수 있어요!
# 2. 함수의 인자로 전달될 수 있어야 해요!
# 3. 함수의 결과로 리턴될 수 있어야 해요!

# 우리가 지금까지 설명한 class로 부터 파생된 instance는 1급객체라고 불려요!
# function도 first class조건을 만족. => python의 함수는 1급함수예요!

# def my_add(x,y):
#     return x + y

# print(my_add(10,20))

# f = my_add

# print(f(100,200))

########################

# def my_add(x,y):
#     return x + y


# def my_mul(x,y):
#     return x * y


# def my_operation(func, x, y):
#     result = func(x,y)
#     return result
    
# print(my_operation(my_add,10,20))

########################

# 함수의 리턴값으로 함수를 사용할 수 있어요!

def addMaker(x):            # x는 지역변수(local variable)
    
    def my_add_maker(y):
        return x + y
    
    return my_add_maker

add_5 = addMaker(5)
add_10 = addMaker(10)

print(add_5(1))  # 6    이상한거예요!!
print(add_10(5))  # 15  이상한거예요!!   => Closure


 

 

 

 

 

# Module
# Database관련 프로그래밍 - 라이브러리(class, function)
# 채팅프로그램과 같은 network 프로그램 - 라이브러리(class , function)
# Framework = library + 동작 mechanism이 같이 들어가 있어요!

# Module : 함수(function)나 변수, class들을 모아놓은 파일을 지칭
# 하나의 python 프로그램에서 불러다가 사용할 수 있는 python 파일을 지칭

# Module을 사용하는 이유
# 코드의 재 사용성을 높일 수 있어요!

#파이썬의 function은 일급함수이지만 모든 언어가 그렇지는 않다 c같은 경우는 아니나 java script는 이에 해당

 

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

 

class variable은 앞에 self가 아닌 class가 들어간다
scope(변수를 찾는 순서)특성상 self도 상관은 없다

class variable은 heap 에 class가 저장될때 같이 저장

클래스에서 만들어진 뭔가 객체
어떤 클래스로부터 만들어졌는지는 인스턴스

'python > 파이썬' 카테고리의 다른 글

파이썬 단어  (0) 2021.07.26
pip, 예외처리, 파일열기  (0) 2021.07.13
객체지향적 프로그래밍, class  (0) 2021.07.02
반복문, 함수,람다  (0) 2021.07.01
파이썬 함수 모음  (0) 2021.07.01