>백엔드 개발 >파이썬 튜토리얼 >Python 매직 메소드에 대한 자세한 설명

Python 매직 메소드에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-10-20 09:22:141325검색

준비

클래스가 새로운 유형인지 확인하려면 모듈 시작 부분에 _metaclass_=type을 넣어야 합니다.

class NewType(Object):
  mor_code_here
class OldType:
  mor_code_here


이 두 클래스 중 NewType이 새로운 클래스이고 OldType이 추가되면 OldType이 됩니다. front _metaclass_=type에서는 두 클래스가 모두 새 클래스에 속합니다.

생성자 메서드

생성자 메서드는 객체 생성 시 생성자 메서드가 즉시 호출됩니다. Python 생성자를 생성하는 것은 매우 간단합니다. init 메서드를 간단한 init 메서드에서 _init_ 메서드의 매직 버전으로 변환하기만 하면 됩니다.

class FooBar:
    def __init__(self):
        self.somevar = 42
          
>>> f =FooBar()
>>> f.somevar
42


일반 메서드 재정의

각 클래스에는 하나 이상의 A 슈퍼클래스( 상위 클래스)는 슈퍼클래스의 동작 메서드를 상속받습니다.

class A:
    def hello(self):
        print 'hello . I am A.'
class B(A):
  pass
>>> a = A()
>>> b = B()
>>> a.hello()
hello . I am A.


B 클래스에는 hello 메소드가 없으므로 B 클래스는 A 클래스를 상속하므로 A 클래스는 hello 메소드라고 불립니다.

하위 클래스에 기능을 추가하는 가장 기본적인 방법은 메소드를 추가하는 것입니다. 그러나 일부 슈퍼클래스 메서드를 재정의하여 상속된 동작을 맞춤설정할 수도 있습니다. 다음과 같습니다:

class A:
    def hello(self):
        print 'hello . I am A.'
class B(A):
    def hello(self):
        print 'hello . I am  B'
>>> b = B()
>>> b.hello()
hello . I am  B


특수 및 생성자 메서드

재정의는 상속 메커니즘에 있습니다. 특히 건축 방법에 대한 중요한 내용입니다. 다음 예를 보십시오.

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print 'Aaaah...'
            self.hungry = False
        else:
            print 'No, thanks!'
>>> b = Bird()
>>> b.eat()
Aaaah...
>>> b.eat()
No, thanks!


이 클래스는 새가 먹을 수 있는 능력이 있음을 정의합니다. 먹은 후에는 다시 배가 고프지 않게 되는데, 이는 위의 실행 결과를 통해 확실히 알 수 있습니다.

그런 다음 SongBird 클래스를 사용하여 Bird 클래스를 상속하고 여기에 노래 부르기 메서드를 추가합니다.

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print 'Aaaah...'
            self.hungry = False
        else:
            print 'No, thanks!'
              
class SongBird(Bird):
         def __init__(self):
                 self.sound = 'Squawk!'
         def sing(self):
                 print self.sound
>>> s = SongBird()
>>> s.sing()
Squawk!
>>> s.eat()
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    s.eat()
  File "C:/Python27/bird", line 6, in eat
    if self.hungry:
AttributeError: &#39;SongBird&#39; object has no attribute &#39;hungry&#39;


예외에는 오류가 명확하게 명시되어 있습니다. SongBird에는 배고픈 기능이 없습니다. 그 이유는 SongBird에서 생성자가 다시 작성되었지만 새 생성자에는 배고픈 속성을 초기화하는 코드가 없기 때문입니다. 원하는 효과를 얻으려면 SongBird의 생성자가 기본 초기화를 보장하기 위해 상위 클래스 Bird의 생성자를 호출해야 합니다.

구현할 두 가지 방법:

1. 바인딩되지 않은 슈퍼클래스 생성자를 호출합니다.

class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print &#39;Aaaah...&#39;
            self.hungry = False
        else:
            print &#39;No, thanks!&#39;
              
class SongBird(Bird):
         def __init__(self):
                 Bird.__init__(self)
                 self.sound = &#39;Squawk!&#39;
         def sing(self):
                 print self.sound
>>> s = SongBird()
>>> s.sing()
Squawk!
>>> s.eat()
Aaaah...
>>> s.eat()
No, thanks!


SongBird 클래스에 Bird.__init__(self) 코드 줄을 추가했습니다. 인스턴스의 메서드가 호출되면 메서드의 self 매개 변수가 자동으로 인스턴스에 바인딩됩니다(이를 바인딩된 메서드라고 함). 그러나 클래스 메서드를 직접 호출하면 인스턴스가 바인딩되지 않습니다. 이를 통해 필요한 자체 매개변수를 자유롭게 제공할 수 있습니다(이러한 메소드를 바인딩되지 않은 메소드라고 함).

현재 인스턴스를 바인딩 해제된 메서드에 self 매개 변수로 제공함으로써 SongBird는 슈퍼클래스 생성자의 모든 구현을 사용할 수 있으며, 이는 배고픈 속성을 설정할 수 있음을 의미합니다.

2. 슈퍼 기능을 사용하세요

__metaclass__ = type  #表明为新式类
class Bird:
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print &#39;Aaaah...&#39;
            self.hungry = False
        else:
            print &#39;No, thanks!&#39;
              
class SongBird(Bird):
         def __init__(self):
                 super(SongBird,self).__init__()
                 self.sound = &#39;Squawk!&#39;
         def sing(self):
                 print self.sound
>>> s.sing()
Squawk!
>>> s.eat()
Aaaah...
>>> s.eat()
No, thanks!


슈퍼 기능은 다음에서만 사용할 수 있습니다. 새로운 스타일의 수업 . 현재 클래스와 객체는 슈퍼 함수의 매개변수로 사용될 수 있습니다. 함수가 반환한 객체를 호출하는 모든 메소드는 현재 클래스가 아닌 슈퍼 클래스의 메소드를 호출합니다. 그런 다음 SongBird 생성자에서 Bird를 사용하는 대신 super(SongBird, self)를 직접 사용할 수 있습니다.

속성

접근자는 getHeight 및 setHeight와 같은 이름을 사용하여 일부 속성을 가져오거나 다시 바인딩할 수 있는 간단한 방법입니다. 특정 기능에 액세스할 때 일부 작업을 수행해야 하는 경우 이와 같은 상태 변수를 캡슐화하는 것이 중요합니다.

class Rectangle:
    def __init__(self):
        self.width = 0
        self.height = 0
    def setSize(self,size):
        self.width , self.height = size
    def getSize(self):
        return self.width , self.height
>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.getSize()
(10, 5)
>>> r.setSize((150,100))
>>> r.width
150


위의 예에서 getSize 및 setSize 메소드는 size라는 가상 속성을 사용합니다. 접근자 메서드, 크기는 너비와 높이로 구성된 튜플입니다.

속성 함수

이전 섹션에서 Rectangle과 같은 클래스를 이미 작성했다면 한 줄만 추가하면 됩니다. 코드:

__metaclass__ = type
class Rectangle:
    def __int__(self):
        self.width = 0
        self.height = 0
    def setSize(self,size):
        self.width, self.height = size
    def getSize(self):
        return self.width ,self.height
    size = property(getSize ,setSize)
>>> r = Rectangle()
>>> r.width = 10
>>> r.height = 5
>>> r.size
(10, 5)
>>> r.size = 150,100
>>> r.width
150

 


이 새 버전의 Retangle에서는 속성 함수가 접근자 함수가 있는 속성을 생성합니다. 매개변수로 사용되며(먼저 값을 가져온 다음 값을 할당함) 이 속성의 이름은 size입니다. 이렇게 하면 더 이상 구현 방법에 대해 걱정할 필요가 없으며 너비, 높이 및 크기를 동일한 방식으로 처리할 수 있습니다.


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