TIL[51]. Python_Class

jake.log·2020년 8월 23일
0

Python

목록 보기
33/39

32.class

1.Class 정의 하기

파이썬에서 class를 선언하기 위해서는 다음과 같이 class 키워드를 사용하면 된다.

class ClassName:
    ...class 내용 코드들

class 이름은 각 단어의 앞글자를 대문자로 사용한다.

Car class는 다음처럼 정의 할 수 있습니다.

class Car:
    pass

class가 정의되면, class로 부터 실체화(instantiate) 할 수 있다.
클래스를 실체화 하는 방법은 간단하다.
다음과 같이 함수를 호출 하듯이 클래스도 호출 하면 됩니다.

hyundai = Car()
bmw = Car()

Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object)다.

1.Class의 attribute(속성)

class에 정의되는 공통 요소들을 class의 attribute(성질 혹은 속성) 이라고 한다.
모든 자동차는 다음과 같은 공통 요소를 가지고 있다.

  • Maker (현대, BMW 등)
  • 모델명 (BMW305, 제네시스 등)
  • 마력 (horse power)

위 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 init 함수를 통해서 정의 해주면된다.(참고로 class 안에서 정의해주는 함수는 method 라고 한다.)

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 한다.
그 중 init 메소드는 class가 실체화 될때 사용되는 함수이다.

예시:

hyundai = Car("현대", "제네시스", 500)

여기서 이미 init 메소드가 호출이 된다.
init 이라고 메소드 이름을 명확하게 명시하지는 않았지만 클래스가 실체화 될때 자동으로 init 메소드가 호출이 된다.

self는 class의 실체(instance)인 객체(object)를 가르킨다!

Car class에서 "self" 는 Car class의 객체인 hyundai나 bmw를 가르킨다
그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 init 함수에 넘겨준다.

  • init 메소드는 클래스가 실체화 될때 자동으로 호출이 된다.
  • init 메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
  • init 메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)

2.Class Method

클래스에서 init 말고도 다른 메소드를 원하는 대로 추가할 수 있다.
속성은 해당 객체의 이름 등의 정해진 성질인 반면에 메소드 action 같은 느낌이라고 생각할 수 있다.

자동차가 할 수 있는 action은?
움직이기, 멈추기, 경적 울리기 등

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return "빠라바라빠라밤"

honk 메소드에도 self 가 들어가 있다.
모든 메소드에는 self 파라미터가 첫번째 파라미터로 들어가야 한다.

honk 함수는 다음 처럼 사용할 수 있다.

hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
"빠라바라빠라밤"

<객체>.<메소드>
호출 할 때 dot notation 을 통해 호출한다.

honk 메소드에서 해당 객체의 회사 정보는
init 메소드에서 self 객체에 해당 정보들을 저장해 놓았기 때문에 다음처럼 사용하면 된다.

class Car:
    def __init__(self, maker, model, horse_power):
        self.maker       = maker
        self.model       = model
        self.horse_power = horse_power

    def honk(self):
        return f"{self.maker} 빠라바라빠라밤"

hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
"현대 빠라바라빠라밤"

Assignment

Class 를 직접 구현해 보겠습니다.
Database 라는 이름의 class를 구현해 주세요.
Database 클래스는 다음의 속성(attribute)들을 가지고 있습니다.

name : database의 이름
size : 저장할 수 있는 데이터의 max 사이즈. Size를 넘어서는 데이터를 저장할 수 없다.

Database 클래스는 다음의 메소드들을 가지고 있습니다.

insert
select
update
delete

Insert
insert 메소드는 self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
Field 는 저장하고자 하는 데이터의 필드명 이고 value는 값입니다.
Field 와 value는 내부적으로 dictionary에 저장되어야 합니다.
insert 메소드는 다음 처럼 호출 할 수 있습니다.

#객체 이름이 db 라는 가정하에
db.insert("name", "정우성")

insert 메소드는 특별한 리턴값은 없습니다.
만일 내부 dictionary의 총 사이즈가 database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 합니다.

Select
select 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 읽고자 하는 데이터의 필드명 입니다.
내부적으로 데이터를 저장하고 있는 dictionary에서 해당 field에 해당하는 키와 연결되어 있는 값을 리턴해주어야 합니다.

예를 들어, 이미 name이라는 필드명으로 "정우성" 이라는 값을 저장했다고 한다면:

#객체 이름이 db 라는 가정하에
db.select("name")
"정우성"

이 되어야 합니다.
만일 해당 필드값으로 저정되어 있는 값이 없다면 None 을 리턴해주세요.

Update
Self 외에 2개의 parameter를 받습니다.
field와 value 입니다.
이름 그대로 이미 저장되어 있는 값을 수정하는 메소드 입니다.

#객체 이름이 db 라는 가정하에
db.update("name", "아이유")

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.

Delete
delete 메소드는 self 외에 1개의 parameter를 받습니다.
field 입니다.
Field 는 지우고자 하는 데이터의 필드명 입니다.

#객체 이름이 db 라는 가정하에
db.delete("name")

만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않습니다.
그리고 특별한 리턴 값은 없습니다.

My solution

class Database :
    def __init__(self, name, size):
        self.name = name
        self.size = size
        self.db   = {}

    def insert(self, field, value):
        if len(self.db) < self.size:
            self.db[field] = value

    def select(self,field):
        if field in self.db:
            return self.db[field]
        else:
            return None
     
    def update(self,field,value):
        if field in self.db:
            self.db[field] = value
   
    def delete(self,field):
        if field in self.db:
            del self.db[field]

Model solution

class Database:
  def __init__(self, name, size):
    self.name = name
    self.size = size
    self.db   = { }
  
  def insert(self, field, value):
    if len(self.db) < self.size:
      self.db[field] = value

  def select(self, field):
    if field in self.db:
      return self.db[field]
    else:
      return None
     
  def update(self, field, value):
    if field in self.db:
      self.db[field] = value
 
  def delete(self, field):
    if field in self.db:
      del self.db[field]
profile
꾸준히!

0개의 댓글