Python 클래스 초기 화 특수 방법

특수 한 방법 은 무엇 입 니까?우리 가 클래스 를 설계 할 때 python 에서 초기 화 하 는 방법 이 있 습 니 다$init__$,자바 의 구조 기 와 유사 하 다.이것 이 바로 특수 한 방법 이 고 마술 방법 이 라 고도 부른다.쉽게 말 하면 특수 한 방법 은 디자인 의 유형 에 신기 한 특성 을 더 할 수 있다.예 를 들 어 python 원생 의 절편 작업,교체,연승 작업 등 을 할 수 있다.python 에서 특수 한 방법 은 두 밑줄 로 시작 하여 두 밑줄 로 끝 냅 니 다.
하나의 큰 예
수학 에 서 는 벡터 라 는 개념 이 있 지만 python 의 데이터 형식 은 없다.우 리 는 python 으로 그것 을 실현 할 방법 을 강구 했다.
먼저 벡터 는 일반적인 데이터 유형 과 달리 전통 적 인 수 는 직접 연산 할 수 있 고 벡터 는 서로 다른 좌 표를 각각 연산 해 야 한다.자,해 봐.
우선 클래스 를 정의 하여 초기 화 방법 을 실현 합 니 다.

#       
class Vector:
  
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y
어떻게 벡터 의 덧셈 을 실현 합 니까?2 차원 벡터 에서 벡터 의 덧셈 은 모든 좌 표를 각각 더 한 결과 이다.python 에$ 가 있 습 니 다.add__$방법

class Vector:
  
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

  #       
  def __add__(self, other):
    x = self.x + other.x
    y = self.y + other.y
    return Vector(x, y)
우 리 는 x 와 y 변 수 를 각각 추가 한 후에 Vector 로 돌아 갑 니 다.python 에서 문자열 을 직접 덧셈 으로 연결 할 수 있 는 원 리 는 바로 여기에 있 습 니 다.python 은 문자열 에 대한 add 방법 을 실현 합 니 다.
덧셈,곱셈 의 이 치 를 실현 한 것 처럼 각 좌 표를 단독으로 곱 하면 된다.

class Vector:
  
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

  #       
  def __add__(self, other):
    x = self.x + other.x
    y = self.y + other.y
    return Vector(x, y)
  
  #       ,  r*3
  def __mul__(self, scalar):
    return Vector(self.x*scalar, self.y*scalar)
우리 가 벡터 연산 을 할 때 자주 사용 하 는 조작 은 벡터 를 구 하 는 모델 이 있 습 니 다.우 리 는$ 를 사용 합 니 다.abs__$특수 한 방법 으로 이 루어 집 니 다.abs 는 보통 하나의 수의 절대 치 를 구 하 는 데 사용 되 고 벡터 가 사용 되 지 않 으 며 모델 을 구 하 는 데 적당 합 니 다.math 모듈 의 hypot 방법 으로$\sqrt(x^2+y^2)$를 계산 합 니 다.

class Vector:
  
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y
  
  #    ,      0,  false
  def __bool__(self):
    return bool(abs(self))

  #       
  def __add__(self, other):
    x = self.x + other.x
    y = self.y + other.y
    return Vector(x, y)
  
  #       ,  r*3
  def __mul__(self, scalar):
    return Vector(self.x*scalar, self.y*scalar)

  
  #       
  # hypot()         sqrt(x*x + y*y)
  def __abs__(self):
    return hypot(self.x, self.y)
예 를 들 어 실행 하 다.

v = Vector(2, 3)
print(v)
v2 = Vector(4, 5)
print(v+v2)
print(v+v2*2)

<__main__.Vector object at 0x000002B4B1843C50>
<__main__.Vector object at 0x000002B4B1843EF0>
<__main__.Vector object at 0x000002B4B1843898>

실행 할 수 있 습 니 다.정확 한 것 같 지만 출력 결과 가 이상 합 니 다.어 떡 하지?python 중 개$repr__$특수 한 방법 으로 콘 솔 출력 스타일 을 수정 할 수 있 습 니 다.

class Vector:
  
  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y
  
  #    ,      0,  false
  def __bool__(self):
    return bool(abs(self))

  #       
  def __add__(self, other):
    x = self.x + other.x
    y = self.y + other.y
    return Vector(x, y)
  
  #       ,  r*3
  def __mul__(self, scalar):
    return Vector(self.x*scalar, self.y*scalar)
  
  #       
  # hypot()         sqrt(x*x + y*y)
  def __abs__(self):
    return hypot(self.x, self.y)
  
  #   __repr__  ,            Vector(1, 2)
  #   __str__,  str()     
  def __repr__(self):
    return 'Vector(%r, %r)' % (self.x, self.y)
$ 실현repr__$방법,우 리 는 콘 솔 에서 Vector(x,y)를 출력 할 수 있 습 니 다.이에 대응 하 는 개$str__$방법 은 str()를 사용 하여 해당 문자열 을 되 돌려 사용자 에 게 보 여 줍 니 다.
이전 프로그램 이 실 행 된 결 과 를 살 펴 보 겠 습 니 다.

v = Vector(2, 3)
print(v)
v2 = Vector(4, 5)
print(v+v2)
print(v+v2*2)
print(abs(v))

Vector(2, 3)
Vector(6, 8)
Vector(10, 13)
3.605551275463989

효과 가 좋다.
특수 한 방법 을 통 해 사용자 정의 형식 은 내 장 된 형식 과 마찬가지 로 python 스타일 의 코드 를 쓸 수 있 습 니 다.
위 에서 말 한 몇 가지 특수 한 방법 을 제외 하고 python 은 80 여 개의 특수 한 방법 이 있 습 니 다.예 를 들 어$len__$방법 은 길 이 를 구 하 는 데 사용 할 수 있 습 니 다.$getitem__$haha[2]와 같은 조작 으로 슬라이스 와 교체 등 을 할 수 있 고 똑 같은 것 은$setitem__$。

좋은 웹페이지 즐겨찾기