제43과 마법 방법: 반연산

7314 단어
내용은 인터넷에서 유래한 것으로 본인은 여기에서 조금 정리할 뿐입니다. 판권 문제가 있으면 자라 정부 소유입니다.
연습문제(자라 공식 포럼에서)

0. 객체 플러스(a + b), a 객체에 이 있는 경우add__방법, b 대상의radd__호출될까요?


답:아니야!
>>> class Nint(int):
    def __radd__(self, other):
        print("__radd__ !")
        return int.__add__(self, other)
              
>>> a = Nint(5)           
>>> b = Nint(3)           
>>> a + b             
8
>>> 1 + b             
__radd__ !
4

1. 파이톤은 언제 반연산의 마법 방법을 사용합니까?


A: 예: a + b, a 객체의add__방법이 실현되지 않거나 상응하는 조작을 지원하지 않으면 파이톤은 자동으로 b의 를 호출합니다radd__방법

2. 계승된 클래스에서 기류를 어떻게 사용하는 방법을 물어보시겠습니까?


A:super()라는 BIF 함수를 사용합니다.
class A(object):
    def __init__(self, a=0):
        self.a = a
    def get(self):
        return self.a

class B(A):
    def __init__(self, b):
        super(B, self).__init__(b)
    def get(self):
        return super(B, self).get()

if __name__ == '__main__':
    b = B(10)
    print(b.get())

3. 만약에 내가 계승하고자 하는 기본 클래스가 동적(때로는 A, 때로는 B)이라면 기본 클래스가 마음대로 수정할 수 있도록 코드를 어떻게 배치해야 합니까?


답: 당신은 먼저 기본 클래스에 별명을 정의할 수 있습니다. 클래스를 정의할 때 계승할 기본 클래스를 대신할 별명을 사용하세요.따라서 기본 클래스를 바꾸고 싶을 때, 별명이 부여한 그 문장을 수정하면 된다.참고로, 당신의 자원이 상황에 따라 결정될 때, 이 작은 기교는 매우 유용하다.
BaseAlias = BaseClass  #  
 
class Derived(BaseAlias):
    def meth(self):
        BaseAlias.meth(self)  #  
        ...


4. 클래스의 정적 속성을 어떻게 사용하는지 스스로 예를 들어 설명한다.


답: 클래스의 정적 속성은 매우 간단합니다. 클래스에서 직접 정의한 변수(self. 없음)정적 속성입니다.인용 클래스의 정적 속성은 '클래스 이름. 속성 이름' 의 형식을 사용합니다.클래스의 정적 속성 적용(클래스가 인스턴스화된 횟수 계산):
#!/usr/bin/python
# -*- coding:utf-8 -*-
class C:
    count = 0  #  

    def __init__(self):
        C.count = C.count + 1  #  . 

    def getCount(self):
        return C.count

c1 = C()
c2 = C()
print(c1.getCount())

출력:
2

5. 클래스 중의 정적 방법을 어떻게 사용하는지 스스로 열거하여 설명하고 정적 방법을 사용하는 데 어떤 차이점과 주의해야 할 점이 있는지 지적해 본다.


답: 정적 방법은 클래스의 특수한 방법입니다. 정적 방법은 일반적인 방법의 앞에 @staticmethod 수식자만 추가하면 됩니다.
>>> class C:
    @staticmethod
    def static(arg1, arg2, arg3):
        print(arg1, arg2, arg3, arg1 + arg2 + arg3)

    def nostatic(self):
        print("I'm the fucking normal method!")

        
>>> c = C()
>>> c.static(1, 2, 3)
1 2 3 6
>>> c.nostatic()
I'm the fucking normal method!
>>>

정적 방법의 가장 큰 장점은 실례 대상에 연결되지 않고 다시 말하면 비용을 절약하는 것이다.
>>> c1 = C()
>>> c2 = C()
>>> c1.static is C.static
True
>>> c1.nostatic is C.nostatic
False
>>> c1.static

>>> c2.static

>>> C.static

#  , 
>>> c1.nostatic
>
>>> c2.nostatic
>
>>> C.nostatic


사용할 때 주의해야 할 점: 정적 방법은self 파라미터가 필요하지 않기 때문에 대상을 사용해서라도 self 파라미터는 전송되지 않습니다.
>>> c.static(1, 2, 3)
1 2 3 6
>>> C.static(1, 2, 3)
1 2 3 6

프로그래밍 문제


0. 하나의 클래스를 정의하고 이 클래스를 실례화할 때 몇 개의 매개 변수가 들어왔는지 자동으로 판단하고 표시한다.


대답:
>>> class C:
    def __init__(self, *args):
        if not args:
            print(" ")
        else:
            print(" %d , :" % len(args), end=' ')
            for each in args:
                print(each, end=' ')

                
>>> c = C(1, 2, 3)
 3 , : 1 2 3 

1. 하나의 단어(Word) 클래스를 문자열에서 계승하고 비교 조작부호를 다시 쓰며 두 개의 워드 클래스 대상을 비교할 때 단어의 길이에 따라 크기를 비교한다.


가산점 요구: 실례화할 때 빈칸이 있는 문자열을 가져오면 첫 번째 빈칸 앞의 단어를 매개 변수로 합니다.


답: 가산점 요구는 중재를 통해new__방법은 (문자열이 변형되지 않기 때문에) 다시 쓰기를 통해gt__、__ lt__、__ ge__、__ le__비교 작업에서 Word 클래스의 표현을 정의하는 방법입니다.주의: 정의된 이 없습니다.eq__및ne__방법이는 Word('FishC')가 Word('Apple')와 같은 이상한 결과가 발생할 수 있기 때문입니다. 코드는 다음과 같습니다.
class Word(str):
    ''' , '''
    def __new__(cls, word):
        #  __new__ , str 
        #  
        if ' ' in word:
            print("Value contains spaces. Truncating to first space.")
            word = word[:word.index(' ')]  #  
        return str.__new__(cls, word)

    def __gt__(self, other):
        return len(self) > len(other)

    def __lt__(self, other):
        return len(self) < len(other)

    def __ge__(self, other):
        return  len(self) >= len(other)

    def __le__(self, other):
        return len(self) <= len(other)

w1 = Word('abcd')
w2 = Word('abca vsdv')
if w1 >= w2:
    print(True)

출력:
Value contains spaces. Truncating to first space.
True

2. 이 시간에 배운 내용을 적어 주세요. 격식에 제한이 없습니다. 회상하고 복창하는 것은 기억을 강화하는 좋은 방법입니다!

  • 반연산과 관련된 마법 방법
  • 마법
    정의
    __ radd__(self, other)
    덧셈을 정의하는 행위: + (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됨)
    __ rsub__(self, other)
    뺄셈을 정의하는 행위: - (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됨)
    __ rmul__(self, other)
    곱셈 동작을 정의합니다: * (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됩니다)
    __ rtruediv__(self, other)
    진제법의 행동을 정의합니다:/(왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됩니다)
    __ rfloordiv__(self, other)
    정수 나눗셈을 정의하는 행위://(왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됨)
    __ rmod__(self, other)
    추출 알고리즘의 행동을 정의합니다:% (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됨)
    __ rdivmod__(self, other)
    divmod () 로 호출될 때의 행동을 정의합니다. (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됩니다.)
    __ rpow__(self, other)
    파워 ()에 호출되거나 ** 연산될 때의 행동을 정의합니다. (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됩니다.)
    __ rlshift__(self, other)
    비트별 왼쪽 이동 동작 정의:<
    __ rrshift__(self, other)
    비트별로 오른쪽으로 이동하는 행위를 정의합니다: >> (왼쪽 동작 수가 해당하는 동작을 지원하지 않을 때 호출됩니다)
    __ rand__(self, other)
    비트와 조작의 행동을 정의합니다: & (왼쪽 동작 수가 해당하는 조작을 지원하지 않을 때 호출됨)
    __ rxor__(self, other)
    비트레이트 또는 조작의 행동을 정의합니다: ^ (왼쪽 동작 수가 해당하는 조작을 지원하지 않을 때 호출됨)
    __ ror__(self, other)
    비트나 조작의 행위를 정의합니다: 곤 (왼쪽 조작 수가 상응하는 조작을 지원하지 않을 때 호출됨)
    반연산 마법 방법을 다시 쓸 때는 반드시 조작수의 순서에 주의해야 한다!
  • 증량부치 연산의 마법 방법
  • 마법
    정의
    __ iadd__(self, other)
    값 덧셈을 정의하는 동작: +=
    __ isub__(self, other)
    값 마이너스 동작을 정의합니다. -=
    __ imul__(self, other)
    대입 곱셈의 동작을 정의합니다:*=
    __ itruediv__(self, other)
    값 진짜 나누기 동작을 정의합니다:/=
    __ ifloordiv__(self, other)
    할당 정수 나눗셈의 동작을 정의합니다://=
    __ imod__(self, other)
    값 추출 알고리즘을 정의하는 행위:%=
    __ ipow__(self, other)
    대입 멱 연산의 동작을 정의합니다. **=
    __ ilshift__(self, other)
    비트별로 왼쪽으로 값을 이동하는 행위를 정의합니다: << =
    __ irshift__(self, other)
    비트별로 오른쪽으로 값을 이동하는 행위를 정의합니다: >>=
    __ iand__(self, other)
    비트와 조작에 따라 값을 부여하는 행위를 정의합니다: & =
    __ ixor__(self, other)
    비트레이트나 조작에 대한 값을 정의하는 행위: ^ =
    __ ior__(self, other)
    값의 위치별 또는 조작 행위를 정의합니다: 곤 =
  • 일원 조작부호의 마법 방법
  • 마법
    정의
    __ neg__(self)
    양수 기호의 동작 정의: +x
    __ pos__(self)
    음수 기호의 동작 정의: -x
    __ abs__(self)
    abs () 에 호출될 때의 행동을 정의합니다
    __ invert__(self)
    비트별로 반전하는 행위 정의: ~x

    좋은 웹페이지 즐겨찾기