>  기사  >  백엔드 개발  >  Python 매직 메소드 - 속성 변환 및 클래스 표현에 대한 자세한 설명

Python 매직 메소드 - 속성 변환 및 클래스 표현에 대한 자세한 설명

WBOY
WBOY원래의
2016-08-04 08:55:371225검색

형변환 마법

형 변환 마법은 실제로 str 및 int와 같은 팩토리 함수를 구현한 결과입니다. 일반적으로 이러한 함수에는 몇 가지 관련 마법 메서드도 있습니다.

•__int__(자신)

•int 함수에 해당하는 정수형으로 변환합니다.

•__long__(자기)

•long 함수에 대응하는 long 정수형으로 변환합니다.

•__float__(자신)

•float 함수에 해당하는 부동 소수점 유형으로 변환합니다.

•__복잡한__(자기)

•복소수 함수에 해당하는 복소수형으로 변환합니다.

•__oct__(본인)

•oct 함수에 해당하는 8진수로 변환합니다.

•__hex__(자신)

•16진수 함수에 해당하는 16진수로 변환합니다.

•__index__(자기)

•먼저, 이 메소드는 int 또는 long일 수 있는 정수를 반환해야 합니다. 이 메서드는 두 가지 위치에서 유효합니다. 첫째, 연산자 모듈의 인덱스 함수에서 얻은 값은 이 메서드의 반환 값입니다. 둘째, 다음 코드 데모는 구체적으로 수행됩니다.

•__trunc__(자기)

• math.trunc(self)가 사용될 때 호출됩니다. __trunc__는 self 유형의 정수 잘림을 반환합니다(일반적으로 긴 정수).

•__coerce__(자신, 타인)

• 유형 강제를 구현했습니다. 이 메서드는 coerce 내장 함수의 결과에 해당합니다(이 함수는 Python 3.0부터 제거되었으므로 이 마법 메서드가 의미가 없음을 의미합니다. 후속 버전에서 다시 지원 여부에 대해서는 공식 홈페이지에 따라 다릅니다. )

•이 함수의 기능은 서로 다른 두 숫자 유형을 동일한 유형으로 강제 변환하는 것입니다. 예:

메서드는 변환된 두 숫자에 해당하는 기본 요소를 반환합니다. 우선 순위는 복소수 > 부동 소수점 수 > 긴 정수 > 정수입니다. 변환 중에는 두 매개변수 중 우선순위가 높은 유형으로 변환됩니다. 변환을 완료할 수 없으면 TypeError가 발생합니다.

이 매직 메소드를 정의할 때 변환을 완료할 수 없으면 None을 반환해야 합니다.

여기에는 Python이 1 1.0과 같은 작업을 수행할 때 먼저 강제 함수를 호출하여 동일한 유형으로 변환한 다음 실행합니다. 왜냐하면 1 1.0 = 2.0이기 때문입니다. 변환 후 실제 연산은 1.0 1.0 입니다. 그런 결과를 얻는 것은 놀라운 일이 아닙니다.

코드 예:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return int(self.x) + 1

  def __long__(self):
    return long(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

여기서 주목해야 할 점은 매직 메소드의 반환 값이 기대치를 충족해야 한다는 것입니다. 예를 들어 문자열(str)과 같은 다른 유형을 임의로 반환하는 경우 __int__는

int 유형을 반환해야 합니다. , 목록( list) 등을 사용하면 오류가 보고됩니다.

def __int__(self):
    return str(self.x)

def __int__(self):
    return list(self.x)

그러나 int는 long을 반환할 수 있으며 int를 반환하면 long이 자동으로 long으로 처리됩니다.

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return long(self.x) + 1

  def __long__(self):
    return int(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

위의 내용은 python2.7.11에서 발생했습니다. 이는 BUG일 수도 있을 정도로 이상한 동작입니다. 간단히 말해서 오류를 방지하려면 해당 유형을 반환하는 데 주의해야 합니다.


__index__(자신):

우선 Operator.index()에 해당하고, Operator.index(a)는 a.__index__()와 같습니다.

import operator

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return self.x + 1

a = Foo(10)
print operator.index(a)

연속적으로 사용하면 놀라운 또 다른 기능:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return 3

a = Foo('scolia')
b = [1, 2, 3, 4, 5]
print b[a]
print b[3]

인덱스로 사용 가능하고 슬라이스 가능:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return int(self.x)

a = Foo('1')
b = Foo('3')
c = [1, 2, 3, 4, 5]
print c[a:b]

실제로 슬라이스 내부에 사용된 함수 슬라이스가 이를 처리합니다. 관심 있는 학생들은 이 함수에 대해 알아볼 수 있습니다.

a = Foo('1')
b = Foo('3')
c = slice(a, b)
print c
d = [1, 2, 3, 4, 5]
print d[c]

__coerce__(자신, 타인):

코드 예:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, str(other.x)

class Boo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, int(other.x)

a = Foo('123')
b = Boo(123)
print coerce(a, b)
print coerce(b, a)

요약: 첫 번째 매개변수를 호출하는 매직 메소드입니다.

수업 대표:

클래스의 표현은 실제로 외부 특성입니다. 예를 들어 print 문을 사용할 때 실제로 인쇄되는 내용은 해당 함수의 출력입니다.

•__str__(self)

• 클래스 인스턴스에서 str()이 호출될 때 발생하는 동작을 정의합니다. print는 기본적으로 str() 함수를 호출하기 때문입니다.

•__repr__(자신)

• 클래스 인스턴스에서 repr()이 호출될 때 발생하는 동작을 정의합니다. str()과 repr()의 주요 차이점은 대상 그룹입니다. repr()은 기계가 읽을 수 있는 출력을 반환하고, str()은 사람이 읽을 수 있는 출력을 반환합니다. Repr() 함수는 교환 모드에서 기본적으로 호출됩니다

•기능.

•__유니코드__(자체)

• 클래스 인스턴스에서 unicode()가 호출될 때 발생하는 동작을 정의합니다. unicode()는 str()과 매우 유사하지만 유니코드 문자열을 반환합니다. 클래스에서 str()이 호출되었지만 __unicode__()만 정의하면

•일. 호출 시 올바른 값이 반환되도록 __str__()을 정의해야 합니다. 모든 사람이 유니코드()를 사용하려는 기분은 아닙니다.

•__format__(self, formatstr)

• 새로운 형식 문자열 메서드를 사용하여 형식을 지정하기 위해 클래스의 인스턴스를 사용할 때 발생하는 동작을 정의합니다. 예를 들어, "Hello, {0:abc}!".format(a)는 a.__format__("abc")가 호출되도록 합니다. 이는 자신만의 숫자 또는 문자열 유형을 정의하는 데 유용합니다

• 매우 의미가 있습니다. 특별한 서식 옵션을 제공할 수 있습니다.

•__hash__(자신)

• 클래스 인스턴스에서 hash()가 호출될 때 발생하는 동작을 정의합니다. 사전에서 빠른 비교를 위해서는 정수를 반환해야 합니다.

•__hash__를 구현할 때 일반적으로 __eq__도 구현한다는 점에 유의하세요. 다음 규칙이 있습니다: a == b 는 hash(a) == hash(b) 를 의미합니다. 즉, 두 매직 메소드의 반환 값이 일관되어야 합니다.

•여기서 '해시 가능한 객체'의 개념을 소개합니다. 먼저, 해시 가능한 객체의 해시 값은 수명 주기 동안 변경되지 않아야 하며, 해시 값을 얻는다는 것은 __hash__ 메서드를 구현하는 것을 의미합니다. 해시 객체는 비교 가능합니다. 즉, __eq__ 또는

구현을 의미합니다.

•__cmp__ 메소드와 해시 객체가 동일할 경우 해당 해시 값이 동일해야 함을 의미합니다. 이 기능을 구현하려면 __eq__의 반환 값이 __hash__와 동일해야 합니다.

•해시 가능한 객체는 사전 키 및 컬렉션 멤버로 사용될 수 있습니다. 이러한 데이터 구조는 내부적으로 해시 값을 사용하기 때문입니다. Python에 내장된 모든 불변 개체(예: 튜플, 문자열, 숫자 등)는 해시 가능하지만 목록과 같은 변경 가능 개체는 해시할 수 없습니다.

• 사전 등.

• 사용자 정의 클래스의 인스턴스는 기본적으로 해시 가능하며 해시 값이 id 함수에서 나오므로 자신 이외의 누구와도 동일하지 않습니다. 그러나 이것이 hash(a) == id(a)를 의미하는 것은 아닙니다. 이 기능에 주의하시기 바랍니다.

•__nonzero__(자기)

• 클래스 인스턴스에서 bool()이 호출될 때 발생하는 동작을 정의합니다. 이 메서드는 반환하려는 값에 따라 True 또는 False를 반환해야 합니다. (python3.x에서는 __bool__로 변경됨)

•__dir__(자신)

• 클래스 인스턴스에서 dir()이 호출될 때 발생하는 동작을 정의합니다. 이 메서드는 사용자에게 속성 목록을 반환해야 합니다.

•__sizeof__(자체)

• 클래스 인스턴스에서 sys.getsizeof()가 호출될 때 발생하는 동작을 정의합니다. 이 메소드는 객체의 크기를 바이트 단위로 반환해야 합니다. 이는 일반적으로 C 확장으로 구현된 Python 클래스에 더 적합하며, 이는 이러한 확장을 이해하는 데 도움이 될 수 있습니다.

여기서 특별히 이해하기 어려운 부분은 없으므로 코드 예시는 생략합니다.

위의 Python 매직 메소드 - 속성 변환 및 클래스 표현에 대한 자세한 설명은 모두 편집자가 공유한 내용이므로 참고가 되기를 바라며, Script Home을 지원해 주시길 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.