2022-01-24-Python-Class

yyj·2022년 2월 1일
0

.

목록 보기
5/21

자동차 class 예시

기본형태

class Car(object):
    # 모든 클래스 안에는 특별한 함수가 존재해야 함!
    # __이름__() ==> 이런 형태의 함수를 magic function이라고 함!
    def__init__(self):
        pass
def my_sum(a,b):
    pass                    # 함수 안에 내용이 없을 시 pass를 사용하여 수행할 코드가 없음을 알림!

print(my_sum(10,20)         # None 출력
# 자동차 클래스 예시
# property
class Car(object):
    # 모든 클래스 안에는 특별한 함수가 존재해야 함!
    # __이름__() ==> 이런 형태의 함수를 magic function이라고 함!
    def __init__(self, car_number, car_price, car_speed):
        self.car_number = car_number
        self.car_price = car_price
        self.car_speed = car_speed
      
car1 = Car('123',1000,0)
car2 = Car('456',2000,20)

# 이렇게 만들어지는 객체를 다른말로 instance라고 함 (class를 기반으로 생성된 메모리 공간)
# __init__() => instance를 초기화 해주는 역할을 수행하기 때문에 initializer라고 함!
	        # 자동으로 호출됨(명시적 호출을 하지 않음) [car = __init__() 이런식을 의미]
# property는 instance내에 생성되는 변수를 지정
class Car(object):
    # 모든 클래스 안에는 특별한 함수가 존재해야 함!
    # __이름__() ==> 이런 형태의 함수를 magic function이라고 함!
    def __init__(self, car_number, car_price, car_speed):
        self.car_number = car_number
        self.car_price = car_price
        self.car_speed = car_speed
      
    # method
    # 일반적으로 method는 property와 연계됨(항상 그런건 아님)
    def go_front(self):
        self.car_speed += 10
        
car1 = Car('123',1000,0)
car2 = Car('456',2000,20)

# . (dot operator)를 이용해서 instance를 사용할 수 있음
# (instance를 지칭하는 refernce).(instance가 가지고 있는 property)
# 즉 => (instance).(property) / (instance).(method)도 가능
# instance가 있다는 얘기는 class가 존재한다는 의미

print(car1.car_number)   # '123'
car1.go_front()          # car1의 속도가 10 증가
print(car1.car_speed)    # 10



class를 조금 다른 각도에서 생각해 보자!

  1. calss는 객체 모델링의 수단
  2. 여러 데이터 타입을 묶어서 하나의 새로운 데이터 타입으로 볼 수 있음
    • ADT(Abstract Data Type) 추상 데이터 타입
  3. instance를 만들어내는 수단
# magic_function => __init__, __str__
class Car(object):
    # initializer
    def __init__(self, car_number, car_price, car_speed):
        self.car_number = car_number
        self.car_price = car_price
        self.car_speed = car_speed
        
    def __str_-(self):
        return self.car_number
        
car1 = Car('123', 1000, 0)
# print(는 인자로 들어온 parameter를 문자열로 변경해서 출력하는 함수
# 만약 인자로 객체가 들어오고 해당 객체에 __str__이 존재하면 이 함수를 호출해서 그 결과를 출력
print(car1)      # 123



class 안에서

  • instance variable과 class variable
  • property는 instance variable과 class variable로 구분됨!
  • instance variable은 instance마다 각자 따로 가지고 있는 property를 지칭
class Car(object):
    
    is_speeding = 120    # class variable
    
    # initializer
    def __init__(self, car_number, car_price, car_speed):
        self.car_number = car_number
        self.car_price = car_price
        self.car_speed = car_speed
  
    def __str_-(self):
        return self.car_number      
   
car1 = Car('123',1000,0)
car2 = Car('456',2000,20)
# class variable은 class이름을 사용할 수 있음
# (instance or class).(property)
print(Car.is_speeding)       # 120
print(car1.is_speeding)      # 120
# instance namespace에서 못찾으면 class namespace가서 찾음
print(car2.is_speeding)      # 120
  • 여기에 method도 포함 시키면?
class Car(object):
    
    is_speeding = 120    # class variable
    
    # initializer
    def __init__(self, car_number, car_price, car_speed):
        self.car_number = car_number
        self.car_price = car_price
        self.car_speed = car_speed
  
    def __str_-(self):
        return self.car_number    
        
    def find_speeding(self):
        if self.car_speed > Car.is_speeding:   # == if self.car_speed > self.is_speeding
        				       # 써도 똑같이 나옴!
                               		       # namespace를 통해 상위로 올라가서 찾음!
            return '과속입니다'
        else:
            return '정상속도입니다!'
    
car1 = Car('123',1000,0)
car2 = Car('456',2000,0)
# class variable은 calss이름을 사용할 수 있음
# (instance or class).(property)
print(Car.is_speeding)    # 120
print(car1.is_speeding)   # 120
# instance namespace에서 못찾으면 class namespace에 가서 찾음
print(car2.is_speeding)     # 120
print(car1.find_speeding)   # 정상속도입니다!

Car.is_speeding = 100       # class를 이용해서 class variable의 값을 수정
print(Car.is_speeding)    # 100
print(car1.is_speeding)   # 100

car1.is_speeding = 100       # instance를 이용해서 class variable의 값을 수정
print(Car.is_speeding)       # 100    ???    120이 출력됨
  • Python은 만약 instance variable이 없으면 생성함! 즉 예제의 car1의 instance안에 is_speeding이라는 변수를 생성!






상속 !?

  • 객체지향의 특징중 하나!
  • 한 class의 특징을 이어받아 다른 class를 확장해서 생성하는 기법
  • python의 모든 class는 상속관계에 있다!
    • A class --> B class
    • A class
      • Parent class (부모 class)
      • Upeer class (상위 class)
      • Super class
    • B class
      • child class (자식 class)
      • 하위 class
      • Sub class

  • 상속 관계가 성립하면 두개의 class간에 특별한 관계가 성립!
  • Is-A relationship (IS-A관계)
    - 즉 Sub class is a Superclass가 성립
    - 이말인 즉슨 사람 = 포유류 (O) sub / supper
    - 포유류 = 사람 (X) super / sub

  • class의 활용을 높이기 위해 상속을 이용함!

  • 사용자가 만드는 모든 class는 object라는 이름의 class를 상속하고 있음!



Unit class로 예시를 들어보겠다.

class Unit(object):
    def __init__(self,life):
        self.life = life
    def show_status(self):
        print("생명력 : {}".format(self.life))

unit1 = Unit(100)            
unit1.show_status           # 생명력 : 100

class Marine(object):
     def __init__(self,life):
        self.life = life
        self.damage = damage
        
    def show_status(self):
        print("생명력 : {}".format(self.life))
        print("생명력 : {}".format(self.damage))
marine1 = Marine(200)
marine1.show_status()    # 생명력 : 200
  • 이 경우 오류가 발생한다!



  • 상속을 이용해서 이 문제를 해결해보자!
class Unit(object):
    def __init__(self,life):
        self.life = life
    def show_status(self):
        print("생명력 : {}".format(self.life))

unit1 = Unit(100)            
unit1.show_status           # 생명력 : 100

class Marine(Unit):
    def __init__(self,life):
        # 상위 class의 __init__()호출함
        super(Marine, self).__init__(life)
        # Marin이라는 class의 상위 클래스를 의미 self는 인자로 둠
	
        self.damage = damage
        
    def show_status(self):
        super(Marine, self).show_status()
        print("생명력 : {}".format(self.damage))
        
marine1 = Marine(100,200)     # 생명력 : 100
marine1.show_status()         # 생명력 : 200




Module

Module : 함수나 변수, class를 모아 놓은 파일을 지칭! (확장자가 .py로 끝나는)

그럼 왜 이렇게 module을 만드나 ? => 다른 파일에서 사용하기 위해!

모듈을 이용하기 위해서는 몇가지 방법이 존재!

  • 가장 쉬운 방법 --> 특정 폴더를 module 폴더로 지정, 그 안에 python module(파일)을 생성
    • ==> ex) my_module.py

  • module은 내가 만들 수도 있고 다른사람이 만든 모듈을 사용할 수도 있음
  • module을 불러들여 보자!
  • module을 불러 들이기 위해 import라는 keyword를 사용
import my_module

# module은 객체
print(my_module.my_var)          # 3.141592   module 파일안에 my_var의 변수 값을 가져옴
print(my_module.my_func(10,20)   # module 파일안에 my_func이라는 함수를 실행하여 얻은 값을 리턴함
  • as : alias(별칭)
import my_module as m    # 이런식으로 사용 할 수 있음

# module은 객체
print(m.my_var)          # 3.141592   module 파일안에 my_var의 변수 값을 가져옴
print(m.my_func(10,20)   # module 파일안에 my_func이라는 함수를 실행하여 얻은 값을 리턴함
  • from ~ import : 모듈 안에서 변수값만 가져다 쓰겠다는 의미
from my_module import my_var
print(my_var)             # 3.141592
  • 경로를 적어서 불러올 수 있다.
import folderA.folderB.module2
print(folderA.folderB.module2.module2_var)
  • as도 사용가능
import folderA.folderB.module2 as m2
print(m2.module2_var)
  • from~ import도 사용가능
from folderA.folderB import module2
print(module2.module2_var)
profile
초보개발자

0개의 댓글