TIL 21.05.17 python class

0

TIL

목록 보기
11/29

파이썬 레플릿 클래스를 공부하다가 내용이 너무 헷갈려서 단계단계 밟아가면 개념을 이해하기 위해 정리

만일 print_name이라는 메서드가 self.name을 리턴한다면 이것은 db의 이름을 리턴하는 것이고


만일 print_name이라는 메서드가 name을 리턴한다면 이것은 함수 호출 시의 인수값을 리턴하는 것

과제 문제 분석

insert 메서드

문제 조건 : Field 는 저장하고자 하는 데이터의 필드명이고 value는 값
내부적으로 딕셔너리에 저장 필요.
만일 내부 dictionary의 총 사이즈가 Database 클래스의 size 속성보다 크면 더이상 새로운 값들을 저장하지 말아야 함

우선 데이터베이스가 처음 인스턴스에 할당이 될 때 사용되는 init 함수에 변수는 name ,size가 있음
인스턴스의 클래스를 할당하려면 self 를 제외한 저 두 개의 변수를 꼭 같이 넣어서 할당해야 한다.

db= Database("db", 3)

만약에 부족하게 인수를 설정하고 인스턴스를 할당하면 다음과 같이 인수를 부족하게 입력했다는 오류가 나온다.

다음으로는 insert 메서드에서 내부적으로 딕셔너리가 필요하다고 했으니 init이 실행될 때 dictionary를 생성한다.

그리고 데이터베이스와 크기를 비교해서 작은 경우만 입력되도록 했으니
self.size와 내부의 딕셔너리의 크기를 비교하여 작은 경우에만 인수로 받은 value 값을 입력받은 field명으로 하는 딕셔너리 값을 내부 딕셔너리 self.get()에 추가해준다. (dict["field"] 에 해당하는 값이 기존에 없다면 새로이 추가가된다.)

  • 디비사이즈 이해

    위 이미지에서 총 4개의 insert를 시도했지만 결론적으로는 3개의 결과만 나온다. 4번째는 db 사이즈 초과라서 담기지 않았다.

select 문제

조건: select 메소드는 self 외에 1개의 parameter를 받습니다.만일 해당 필드값으로 저정되어 있는 값이 없다면 None 을 return.

select 메서드에서 가장 먼저 해야 할 것은 입력받은 field가 내부 딕셔너리에 이미 등록이 되어있는지 확인하는 것이다. 없다면 None을 리턴하고 존재한다면 딕셔너리에서 입력받은 field를 키로 가지는 값을 출력해주면 된다.

그래서 db.select("name") 는 내부 딕셔너리에서 name을 키로 가지는 값들을 출력하게 된다.
현재 내부 딕셔너리에서는 {"name" : "정우성"}이 들어있어 "name"이라는 입력받은 "name"과 같은 field를 가지고 그때의 값은 "정우성"이다.

update 문제

조건: 2개의 파라미터 fieldvalue . 만일 field값에 해당하는 데이터가 저장되어 있지 않으면 아무것도 하지 않음.

새로입력받은 value 값을 다시 내부 딕셔너리에 field와 이름이 같은 키에 부여한다.( dict의 "name"과 매개변수 "name"을 비교)
새로이 다시 할당하면 기존 값을 대체하는 개념

다시 Select로 조회해보면 기존에 정우성이 아닌 아이유가 나오는 것을 확인 가능

delete 문제


처음 접근을 할 때 값을 빈칸으로 대체를 하면 되지 않을까 싶음 그런데 output이 나오는 것이었음 --> 이거는 완벽히 제거가 안된 것이다 생각하여

다른 분의 코드를 참고하여 del를 적용 그러니 결과물이 안나왔음. (반환된 값이 Null)- 제거완료!


정적 메서드 / 동적 메서드

정적메서드를 이해하면 자연스레 동적 메서드가 이해가 간다 (반대개념이니 당연하지?!)

정적 메서드는 인스턴스를 받는 것이 아니라 클래스 자체에서 호출하는 메서드다.

쉽게 말하면 각각의 개체보다는 그 클래스의 성격을 확인하기 위해 사용되는 메서드라 생각을 하면 될 듯 하다.


표현 방식은 데코레이터 @staticmethod를 해당 함수 위에 올려주어서 적용한다.
추가로 대부분의 메서드가 클래스를 받기 위해서 self 또는 그 클래스의 이름을 함수 안에 변수로 넣어주는 반면 정적 메서드는 이 변수가 생략이 된다.

그리고 출력을 할 때도 인스턴스에 메서드를 적용하는 것이 아니라 바로 클래스.method 방식으로 호출한다.

자 이제 왜 정적이라는 이름이 붙었는지 확인을 해보자. 기존 메서드는 클래스에 부여되는 인스턴스에 따라서 동적 (역동적 생각)으로 적용되는 대상이 달라지지만 정적 메서드클래스 자체에 적용되기 때문에 정적이다.

profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글