Python 에서 자주 사용 하 는 마법 방법 을 자세히 설명 합 니 다.
Python 의 마법 방법 은 특정한 상황 에서 자동 으로 호출 되 며,그들의 방법 명 은 보통 두 밑줄 로 둘러싸 여 있 습 니 다.이전에 우리 가 배 운 구조 함수 와 분석 함 수 는 마법 방법 에 속 합 니 다.
2.연산 자 과부하
Python 에 도 연산 자 를 다시 불 러 옵 니 다.사실 모든 연산 자 는 해당 하 는 마법 방법 으로 처리 하 는 대상 입 니 다.마법 방법 에 대응 하 는 연산 자 는 다음 과 같 습 니 다.
간단 한 예 를 들 어 보 겠 습 니 다.
class A:
def __init__(self,x):
self.x = x
def __add__(self,other):
return int(self.x)+int(other.x)
a = A(3.3)
b = A(5.2)
print(a+b)
유사 한 것 은 반 연산 과부하 와 증 량 복제 연산 도 있 는데,용도 가 비교적 적어 더 이상 설명 하지 않 는 다.3.인쇄 작업 의 마법 방법
__str__(self)
:반환 값 은 str 형식 입 니 다.문자열 로 대상 을 출력 해 야 할 때(print 를 호출 할 때)이 방법 을 자동 으로 호출 합 니 다.예 를 들 어
class A:
def __str__(self):
return ' '
a = A()
print(a)#
__repr__(self)
:반환 값 은 str 유형 입 니 다.우리 가 셸 에 대상 이름 을 직접 입력 하고 Enter 를 누 르 면 자동 으로 이 방법 을 호출 합 니 다.그 도__str__
와 같은 기능 을 가지 고 있 습 니 다.그러나 둘 다 다시 쓰 면 print 를 사용 할 때__str__
의 우선 순위 가 높 습 니 다.__repr__
기계 에 보 여 주 는 것 입 니 다.__str__
예 를 들 어 보 여 주 는 것 입 니 다.
>>> class A:
def __str__(self):
return ' '
def __repr__(self):
return ' '
>>> a = A()
>>> a
>>> print(a)
4.속성 조작의 마법 방법__getattr__(self, name)
:사용자 가 존재 하지 않 는 속성 을 가 져 오 려 고 할 때 행동 을 정의 합 니 다.그 중에서 name 은 속성 명 이 고 문자열 입 니 다.아래 는 같 습 니 다__getattribute__(self, name)
:이러한 속성 이 접근 할 때의 행 위 를 정의 합 니 다.이 방법 은 기본적으로 이 속성의 값 을 되 돌려 줍 니 다__setattr__(self, name, value)
:하나의 속성 이 설정 되 었 을 때의 행 위 를 정의 합 니 다.value 는 이 속성 에 대한 값__delattr__(self, name)
:속성 이 삭 제 될 때의 행동 을 정의 합 니 다
class A:
def __init__(self):
self.id = "Pyhon"
def __getattr__(self,name):
print(name+" ")
def __getattribute__(self,name):
print(" "+name+" ")
return super().__getattribute__(name)
def __setattr__(self,name,value):
print(" "+name+" "+value)
super().__setattr__(name,value)
def __delattr__(self,name):
print(" "+name+" ");
super().__delattr__(name)
def fun(self):
pass
a = A()
a.name
a.name = " "
del a.name
a.fun()
# output:
# id Pyhon
# name
# name
# name
# name
# fun
결 과 를 통 해 알 수 있 듯 이 우리 가 하나의 속성 을 방문 할 때 먼저 호출__getattribute__
되 었 고 이 속성 이 존재 하지 않 으 면 다시 호출__getattr__
되 었 다.이 몇 가지 방법 을 사용 할 때 는 무한 재 귀 에 빠 지지 않도록 주의해 야 한다.연산 자 를 다시 실 을 때 도 이런 실 수 를 하기 쉽다.예 를 들 어 아래 의 오류 등 이다.
class A:
def __init__(self):
self.id = "Pyhon"
def __setattr__(self,name,value):
print(" "+name+" "+value)
if(name == "id"):
self.id = value
a = A()
이 프로그램 을 실행 할 때 무한 재 귀 에 빠 질 것 입 니 다.이 유 는__setattr__
에서 self 대상 에 게 직접 속성 대 가 를 부여 하고 이 는__setattr__
방법 을 호출 하기 때 문 입 니 다.그래서
__setattr__
에서 우 리 는 보통 부모 류__setattr__
방법 으로 self 대상 의 속성 대 가 를 부여 합 니 다.이것 은 무한 재 귀 에 빠 지지 않 습 니 다.다른 몇 가지 방법 과 연산 자 를 다시 불 러 오 는 것 도 마찬가지 입 니 다.상기 절 차 를 수정 한 후에 다음 과 같 습 니 다.
class A:
def __init__(self):
self.id = "Pyhon"
def __setattr__(self,name,value):
print(" "+name+" "+value)
if(name == "id"):
super().__setattr__(name,value)
a = A()
# output
# id Pyhon
5.설명자__get__(self, instance, owner)
:다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 을 방문 할 때 이 방법 을 호출 하여 이 인 스 턴 스 대상 의 인용 을 되 돌려 줍 니 다.그 중에서 인 스 턴 스 는 이 대상 을 방문 하 는 인 스 턴 스 대상 의 인용 입 니 다.다음 과 같 습 니 다.owner 는 이 대상 을 방문 하 는 클래스 대상__set__(self, instance, value)
:다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 에 게 값 을 부여 할 때 이 방법 을 사용 합 니 다.그 중에서 value 는 이 대상 에 게 부여 한 값__delete__(self, instance)
:다른 인 스 턴 스 대상 을 통 해 이러한 인 스 턴 스 대상 을 삭제 할 때 이 방법 을 사용 합 니 다
class Fit:
def __init__(self):
self.height = 180
self.weight = 80
def __get__(self,instance,owner):
print("get:",instance,owner)
return [self.height,self.weight]
def __set__(self,instance,value):
print("set:",instance,value)
self.height = value
self.weight = value/2
def __delete__(self,instance):
del self.height
del self.weight
print("delete:",instance)
class Test:
fit = Fit()
t = Test()
print (t.fit)
t.fit = 190
del t.fit
# output:
# get: <__main__.Test object at 0x0000023EFFA738C8> <class '__main__.Test'>
# [180, 80]
# set: <__main__.Test object at 0x0000023EFFA738C8> 190
# delete: <__main__.Test object at 0x0000023EFFA738C8>
일반적인 상황 에서 위의 몇 가지 마법 방법 은 우리 가 하나의 속성 을 정의 하고 이 속성 에 대해 해당 하 는 조작 을 할 수 있 기 를 바 랍 니 다.호출 방법 을 통 해 조작 하 는 것 이 아니 라 우 리 는 이 속성의 유형 을 정의 하여 위의 몇 가지 마법 방법 을 실현 하고 필요 한 속성 을 사례 대상 으로 삼 아 완성 할 수 있 습 니 다.예 를 들 어 위의 Fit 은 사실 체형 류 이 고 Test 에 fit 라 는 체형 속성 이 있 습 니 다.우 리 는 Fit 에서 Fit 의 인 스 턴 스 대상 을 조작 할 때 실행 하 는 동작 을 정의 합 니 다.6.맞 춤 형 시퀀스
__len__(self)
:이러한 인 스 턴 스 대상 이 len()에 호출 될 때의 행 위 를 정의 합 니 다__getitem__(self, key)
:이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 가 져 오 는 행 위 를 정의 합 니 다.즉,self[key]를 실행 할 때의 행동__setitem__(self, key, value)
:이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 설정 하 는 행 위 를 정의 합 니 다.self[key]=value__delitem__(self, key)
:이러한 인 스 턴 스 대상 에서 지정 한 요 소 를 삭제 하 는 뉴스 를 정의 합 니 다.del self[key]
class CountList:
def __init__(self,*args):
self.values = [x for x in args]# , args values
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self.values)
def __getitem__(self,key):
self.count[key] += 1;
return self.values[key]
c = CountList(1,3,5,7,9,11)
print(c[1])
print(c[1]+c[2])
print(c.count)
# output:
# 3
# 8
# {0: 0, 1: 2, 2: 1, 3: 0, 4: 0, 5: 0}
이 클래스 의 count 는 대응 하 는 요소 가 방문 한 횟수 를 기록 하 는 것 입 니 다.다른 두 개 도 차이 가 많 지 않 습 니 다.더 이상 예 를 들 지 않 습 니 다.교체 기
교체 기 는 교체 방법 을 제공 하 는 용기 이 고 교체 방법 이란 다음 두 가지
__iter__
와__next__
이다.교체 가능,즉
__iter__
방법 을 제공 하 는 용기 입 니 다.우리 가 전에 말 한 문자열,목록,모듈,사전,집합 은 모두 교체 가능 하지만 그들 은 교체 기 가 아 닙 니 다.Python 의 내장 함수iter(iterable)
를 사용 하여 해당 하 는 교체 기 를 얻 을 수 있 습 니 다.교체 기 사용next(iterator)
은 다음 요 소 를 얻 을 수 있 습 니 다.이 두 가지 방법 은 사실 교체 기__iter__
와__next__
를 호출 한 것 이다.__iter__(self)
:교체 기 를 가 져 올 때의 행동 을 정의 합 니 다__next__(self)
:교체 기 에 대응 하 는 다음 요 소 를 가 져 올 때의 행동 을 정의 합 니 다
class Fb:
def __init__(self,n = 20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
t = self.a
self.a = self.b
self.b = t + self.b
if(self.a <= self.n):
return self.a
else:
raise StopIteration
f = Fb()
for i in f:
print(i,end=' ')
# output:1 1 2 3 5 8 13
그 중에서 raise 는 이상 을 되 돌려 줍 니 다.위의 프로그램 은 아래 와 같 습 니 다.
class Fb:
def __init__(self,n = 20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
t = self.a
self.a = self.b
self.b = t + self.b
if(self.a <= self.n):
return self.a
else:
raise StopIteration
f = Fb()
it = iter(f)
while True:
try:
i = next(it)
print(i, end=' ')
except StopIteration:
break;
이렇게 하면 우 리 는 Python 에서 for 순환 의 원 리 를 잘 알 수 있 습 니 다.먼저 iter 를 통 해 교체 기 대상 을 얻 은 다음 에 next 를 계속 호출 하여 i 에 게 다음 요소 의 할당 을 가 져 옵 니 다.StopIteration 이상 이 발생 할 때 까지.파 이 썬 이 자주 사용 하 는 마법 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 마법 방법 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.