형변환 마법
형 변환 마법은 실제로 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을 지원해 주시길 바랍니다.