[210716 TIL] Python

Choi Rim·2021년 7월 16일
0

Python

목록 보기
13/20
post-thumbnail

Exceptions

  • exceptions : 예외

  • 파이썬에서 예외 사항이란 의도하지 않는 에러가 일어나는 상황이다.

    • exception이 일어났다.
      >>> list = [1, 2, 3, 4]
      >>> list[4]
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      IndexError: list index out of range
      
  • 리스트 요소의 수가 4개 밖에 없는데 5번째 요소를 indexing하게 되면 IndexError가 일어난다.

  • 이러한 exception이 발생하지 않도록 코드를 구현하는 것이 가장 좋겠지만, 현실적으로 항상 가능한 것은 아니다.

  • exception이 발생하면, 발생한 코드 위치에서 다음 코드들이 실행되지 않고 곧바로 프로그램이 종료된다.

Exception handling

  • exception이 발생해도 해당 프로세스를 종료하지 않고 대신 다른 로직을 실행하게 한 후 프로그램을 계속 실행하게 할 수 있다.
    • exception handling
    • 유저가 잘못된 값을 input으로 입력해 exception이 일어났다고 해도, 종료하지 않고 유저에게 메세지를 리턴하도록 할 수 있다.
try:
     문장1
     문장2
     ...
     문장N    
except Exception:
     exception이 났을 경우 실행할 예외 처리코드
finally:
     Exception 여부와 상관없이 항상 마지막에 실행되는 코드
  • exception handling은 try.. except.. 구문을 사용해 실행한다.
def exception_handling(index):
    list = [1, 2, 3, 4]
    element = 0

    try:
        element = list[index]
        print("exception이 발생하지 않았습니다.")

    except:
        print("exception이 발생했습니다!")
        element = -1
    
    finally:
        print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다")

    return element
  • exception이 발생하지 않으면 try안에 있는 구문들이 실행되고 finally안의 구문이 실행된다.
  • exception이 발생하면 except안에 있는 구문들이 실행되고 finally안의 구문이 실행된다.

클래스 속성과 인스턴스 속성

클래스 속성

def 클래스이름:
	속성 = 값
  • 클래스 속성은 클래스에 바로 속성을 만든다.
class Person:
    bag = []

    def put_bag(self, stuff):
        self.bag.append(stuff)

hyerim = Person()
hyerim.put_bag('아이패드')

tom = Person()
tom.put_bag('맥북')

print(hyerim.bag)
print(tom.bag)

['아이패드', '맥북']

['아이패드', '맥북']
  • Person이라는 클래스를 만든다.
  • bag이라는 속성을 만든다.
  • stuff를 bag에다가 추가한다.
  • 왜 두명의 가방에 '아이패드'와 '맥북'이 추가되었을까?
    • 클래스라는 속성은 클래스에 속해있고, 인스턴스에서 공유를 하게된다.
    • 그래서 두명의 가방에 모두 넣은 stuff가 공유된다.

사진 출처 - 파이썬 코딩 도장

  • 클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유한다.
class Person:
    bag = []

    def put_bag(self, stuff):
        self.bag.append(stuff)
  • 위 코드에서는 put_bag 메서드에서 클래스 속성 bag에 접근할 때 self를 사용했다.
  • 사실 self는 현재 인스턴스를 뜻하므로 클래스 속성을 지칭하기에는 조금 모호하다.
class Person:
    bag = []

    def put_bag(self, stuff):
        Person.bag.append(stuff)
  • 클래스 속성에 접근할 때는 다음과 같이 클래스 이름으로 접근하면 좀 더 코드가 명확해 진다.
  • Person.bag이라고 하면 클래스 Person에 속한 bag 속성이라는 것을 바로 알 수 있다.
  • 클래스 바깥에서도 클래스 이름으로 클래스 속성에 접근하면 된다.

클래스 속성을 찾는 과정

사진 출처 - 파이썬 코딩 도장

  • 파이썬에서는 메서드 이름을 찾을 때 인스턴스 - 클래스 순서대로 찾는다.
  • 인스턴스 속성이 없으면 클래스 속성을 찾게 된다.

인스턴스 속성

class Person:
    #class 속성
    #bag = []
    def __init__(self):
        self.bag = []
        
    def put_bag(self, stuff):
        self.bag.append(stuff)

hyerim = Person()
hyerim.put_bag('아이패드')

tom = Person()
tom.put_bag('맥북')

print(hyerim.bag)
print(tom.bag)
['아이패드']
['맥북']
  • 가방을 여러 사람이 공유하지 않으려면 bag을 인스턴스 속성으로 만들면 된다.
  • 인스턴스 속성은 인스턴스 별로 독립되어 있으며, 서로 영향을 주지 않는다.
  • 클래스 속성과 인스턴스 속성의 차이
    • 클래스 속성
      • 모든 인스턴스가 공유
      • 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용
    • 인스턴스 속성
      • 인스턴스별로 독립되어 있음
      • 각 인스턴스가 값을 따라 저장해야 할 때 사용

비공개 클래스 속성

def 클래스이름:
	__속성 =
class SecretItem:
    __item_secret = '반지' #비공개 클래스 속성

    def take_item(self):
        print(SecretItem.__item_secret) #클래스 안에서만 접근할 수 있음

thief = SecretItem()
thief.take_item() #'반지'

print(thief.__item_secret) #클래스 바깥에서는 접근할 수 없음
반지
Traceback (most recent call last):
  File "class2.py", line 10, in <module>
    print(thief.__item_secret) #클래스 바깥에서는 접근할 수 없음
AttributeError: 'SecretItem' object has no attribute '__item_secret'
  • 클래스 안에서만 접근할 수 있고, 클래스 바깥에서는 접근할 수 없다.
profile
https://rimi0108.github.io/

0개의 댓글