boostcamp AITech

[주말]Python의 특수한 메소드와 underscore

라이크나우 2021. 1. 24. 23:45

클래스를 배울 때 __init__, __add__, __str__을 스치듯이 다루고 넘어갔었다.

주말인 오늘은 이것들에 대해서 자세히 탐구해보려고한다.

 

질문 1

__init__이 생성자인건 알겠고, 여기서 속성들을 초기화하면 되는 것도 알겠다. 그런데, setData() 메소드를 하나 만들어서 거기서 초기화하면?
가능은 한데 권장하지 않는건지 / 아니면 getData()에서 초기화를 한다고 해도 __init__에서 setData()를 불러서 한번 더 self.value=value 이런식으로 해줘야하는건지 모르겠당

 

__init__

class를 초기화하기 위한 함수이다.
인스턴스를 만들 때 가장 먼저 실행된다.

 

__del__

소멸자
객체를 없애려고 할 때 쓰면 된다. 객체가 더 이상 필요 없을 때 파이썬이 자동으로 처리하기도 한다!

 

__repr__

하는 역할은 __str__랑 비슷하다
차이점을 이해하느냐 좀 애먹었다
사실 뻥이다. 아직도 이해 안된다.
str은 객체를 평문화하는데 중점이 되고, repr은 객체를 표현하는데 중점이 되어있다고한다.
뭐래는겨...

 

shoark7.github.io/programming/python/difference-between-__repr__-vs-__str__

 

[Python] __str__와 __repr__의 차이 살펴보기

Python에서 객체를 표현하는 두 함수 str, repr의 차이를 알아보겠습니다.

shoark7.github.io

블로그를 참고하자

 

__add__

+ 연산자를 오버라이딩 하는거다
동일하게 __sub__ 도 가능하다
수학을 위한 메소드는 참 많은데
mul truediv floordiv mod lshift rshift and or xor pow neg invert abs 등 다 가능하다

 

__cmp__

비교하는 메소드이다.
이걸 오버라이딩하면 객체 간에 > < == 를 쓸 수 있다.

 

이정도면 충분한 것 같다. 나중에 충분하지 않은 날이 오면 미래의 고니가 책임질거랬다.

 

마무리로,

__double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, __import__ or __file__. Never invent such names; only use them as documented.

PEP8의 내용을 복사해오며 마무리~

underscore

이제 python에서의 underscore에 대해서 좀 다뤄보려한다.

애초에 __어쩌구__ 형태 자체가 참 특이하다고 느껴졌었다.

PEP8의 내용을 참고해서 적어보았다.

 

  •  _single_leading_underscore 그러니까 _var 이렇게 적기

    관습적인 의미로는 해당 변수 또는 메서드가 내부용으로 쓰일 것이다를 의미한다

    그리고 _method_name 이런식으로 지어진 메소드는 from module import *을 할 때 불러와지지 않는다!
  • single_trailing_underscore_ 즉 var_

    변수 이름이 파이썬 언어의 키워드로 사용되었을때 충돌을 피하기 위해 사용한다

    class가 예약어니까 class_ 이런식으로
  • __double_leading_underscore 즉 __var : name mangling

    이건 컨밴션은 아니고 문법이다. 클래스 간의 속성명의 충돌을 방지하기 위해 사용된다.

    서로 같은 이름의 메소드를 가지지만 오버라이드 되지 않도록 한다.
    private의 용도로는 권장하지 않는다고 한다.
  • __double_leading_and_trailing_underscore__ 즉 __var__

    매직 객체 혹은 속성이다. 특정한 문법적 기능을 제공하거나 특정한 일을 수행한다. 사용자가 직접 만들 수는 있으나 보통 그러진 않고 글의 초입에 적힌대로 사용하는 것이 적절한 용법이다

이 정도로 정리해보았다. 아직 맹글링이 아리쏭해서인지 __double_leading_underscore는 잘 이해가 안간다. 질문해야징

 

@property

데코레이터 중 property가 조금 궁금했어서 추가로 공부해보았다.

www.daleseo.com/python-property/

 

[파이썬] property 사용법 (함수/데코레이터)

Engineering Blog by Dale Seo

www.daleseo.com

참 좋은 분들이 많다. 이해가 잘된다. 

우선 property의 용도먼저 알아봐야한다.

getter와 setter로만 객체의 변수에 접근 가능하도록 변수를 선언했다면, 코드가 조금 지저분해질 수 있다.

instance_name.set_somethin(value) 이런식으로 setter이름을 일일이 치면서 해야하니까

그럴 경우 property(getter, setter)를 해주면 숨겨진 변수에 바로 접근이 가능하다.

 

내부적으로는 property를 거쳐서 getter setter를 이용하는거겠지만, 코드에서는 그게 티가 안난다.

 

이제 그럼 propery를 데코레이터로서 사용하면 더욱 코드가 예뻐진다.

 

getter위에는 @property를

setter위에는 변수명.setter를 해주면

바로 변수에 접근 하는 것 처럼 보이는 코드를 짤 수 있다!