[파이썬 기초] 파이썬의 특수한 방법을 이해하고 코드를 읽어주세요!

개시하다


이번에는 파이톤의'특별한 방법'에 대한 해설을 진행한다.
나는 파이톤의 실제 업무에서 다른 사람이 쓴 코드를 자주 읽는다.
그때는 상당한 주파수로 특수한 방법을 사용하고 있었다.
익숙하지 않으면 무엇을 하고 있는지 모르지만 시간만 지나갈 수 있다.
이런 상황을 방지하기 위해 이 글의'특별한 방법'에 익숙해지면 다른 사람이 쓴 코드를 유창하게 읽을 수 있겠지!
"파이썬의 기본은 거의 익혔어요!"
파이썬반에 대한 지식을 깊이 있게 하고 싶습니다."
"파이썬의 특별한 방법은 무엇입니까?"
"다른 사람의 코드를 읽을 수 있게 되고 싶어요."
이런 사람을 도울 수 있다면 다행이야!
오프닝은 빨리 본론으로 들어가자.
!
이 글은 파이톤의 반을 이해하는 것이 가장 좋다.'반'을 이해하기 어려운 사람은 아래의 내용을 참고하여 공부하세요.
https://chaldene.net/python-book

본론으로 들어가기 전에.


파이톤의 특수한 방법은 매우 많다.
그중에 자주 사용하는 것들을 주로 소개합니다.
이 설명서 이외의 특수 방법을 사용하려면 공식 문서를 참고하거나 검색하십시오.
또 이 기사에서는 상세한 해설에 주의하기 때문에 같은 코드를 반복한다.
집요하다고 생각하시는 분들도 계시겠지만 초보자를 대상으로 쓴 것이니 양해부탁드립니다.

new


!
인스턴스가 생성됩니다.

개요

__new__ 인스턴스 객체를 생성하기 전에 호출합니다.
실례 대상이 호출 클래스라고 생각하면 문제없습니다.self 실례 대상, 클래스 대상을 첫 번째 매개 변수cls에 대입한다.
수정할 수 없는 객체를 수정하려는 장면입니다.
그럼, 우리 빨리 와서 봅시다.
class Cardene:
    def __new__(cls):
        print("__new__")
        print(f"cls: {cls}")
        return super().__new__(cls)
    
    def __init__(self):
        print("__init__")
        print(f"self: {self}")
        
cardene = Cardene()
제2행 정의, 매개 변수 채택cls.
출력을 확인하세요.
__new__
cls: <class '__main__.Cardene'>
__init__
self: <__main__.Cardene object at 0x10944cfd0>
__new__의 한 쪽은 클래스 자체이고 다음 장 해설__init__은 클래스 대상임을 확인할 수 있다.

인스턴스가 생성되지 않음


참고로 실례__init__가 생성되지 않으면 호출되지 않습니다.
확인해봐.
class Cardene:
    def __new__(cls):
        print("__new__")
        print(f"cls: {cls}")
        # return super().__new__(cls)
    
    def __init__(self):
        print("__init__")
        print(f"self: {self}")
        
cardene = Cardene()
다섯 번째 줄의 부분은 이미 주석을 달았다.
__new__
cls: <class '__main__.Cardene'>
아까 불렀던 __init__는 안 불렀어요.
이렇게 __new__ 생성되지 않으면 __init__라고 불리지 않도록 주의하세요.
정의되지 않은 경우__new__ 인스턴스가 자동으로 생성됩니다.

엘라토 객체 변경


'이세계'는'변경할 수 없다'는 뜻이다.
원조 등을 정의하면 수정할 수 없는 대상을 가리킨다.
일반 클래스에서 라우팅되는 [음소거판] 객체는 수정할 수 없습니다.
일단 원조부터 확인해.
numbers = (1, 2, 3)

print(numbers)
# (1, 2, 3)
에서 이 원조를 변경한다.
numbers = (1, 2, 3)

numbers[1] = 4

print(numbers)
# TypeError: 'tuple' object does not support item assignment
예상대로 오류가 발생했습니다.
그럼 __init__ 말고 변경을 더해 보세요.
class Cardene:
    def __init__(self, num_tuple):
        self.num_tuple = num_tuple
        print(num_tuple)
        self.num_tuple[1] = 4
        
cardene = Cardene((1, 2, 3))
다섯 번째 줄에서 아까와 같이 네 번째 대입.
TypeError: 'tuple' object does not support item assignment
아까와 같은 오류가 발생했습니다.
그럼 __new__로 해결합시다.
class Cardene(tuple):
    def __new__(cls, num_tuple):
        self = tuple.__new__(cls, (
            num_tuple[0], 4, num_tuple[2]
        ))
        print(self)
    
cardene = Cardene((1, 2, 3))
네 번째 줄에서 원조를 다시 정의한다.
(1, 4, 3)
변경됐네요!
"아냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐냐
이렇게 생각하는 사람은 매우 예민하다!
그냥 이런 느낌 어때요?
class Cardene(tuple):
    def __new__(cls, num_tuple):
        self = tuple.__new__(cls, (
            num_tuple[0], 4, num_tuple[2]
        ))
        print(self)
        
    def __init__(self, num_tuple):
        self.num_tuple = num_tuple
        print(num_tuple)
        
    
cardene = Cardene((1, 2, 3))
아까도 같은 __init__를 정의했는데 거기다__new__.
(1, 4, 3)
잘 나오네요.
하고 싶은 말이 있다면 __init__ 때 원조의 내용이 달라졌죠?
따라서 사실상 원조의 내용을 바꿀 수 있다.
조금 어렵지만 이렇게 사용하려면 머리 한 귀퉁이에 두세요.

참고 자료


!
  • https://python.ms/new/#_1-new-와 -iit-의 차이
  • https://python.ms/immutable/#_1- 간단히 말해서
  • https://qiita.com/FGtatsuro/items/49f907a809e53b874b18
  • 계속하다


    다음은 다음과 같은 문장으로 총결산할 것이다.
    https://chaldene.net/python-method
    특별한 방법을 더 자세히 배울 수 있기 때문에, 관심 있는 사람은 반드시 가야 한다!
    (당연히 공짜지!)

    좋은 웹페이지 즐겨찾기