>  기사  >  백엔드 개발  >  Python의 생성자 메서드 분석(예제 포함)

Python의 생성자 메서드 분석(예제 포함)

不言
不言앞으로
2018-10-10 16:00:053105검색

이 기사의 내용은 Python의 구성 방법 분석에 관한 것입니다(예제 포함). 필요한 친구가 참고할 수 있기를 바랍니다.

Python에서는 __init__(self)와 같이 함수 이름 앞뒤에 이중 밑줄이 오는 것을 볼 수 있습니다. 객체가 이러한 메서드 중 하나를 사용하는 경우 해당 메서드는 특별한 상황에서 실행되지만 이러한 메서드가 직접 호출되는 경우는 거의 없습니다.

이전 버전의 Python 코드와 호환될 필요가 없다면 모든 클래스를 새로운 스타일의 클래스로 작성하고 코드 작성 시 super 함수와 같은 기능을 사용해야 합니다.

Python 3.0에는 "이전 스타일" 클래스가 없으며 Object를 하위 클래스로 분류하거나 메타 클래스를 유형으로 설정할 필요가 없습니다(코드의 시작 줄 __metaclass__=type). 이는 모든 클래스가 암시적으로 Object의 하위 클래스가 되기 때문입니다. . 명시적인 슈퍼클래스가 없으면 직접 서브클래스화되고, 그렇지 않으면 간접적으로 서브클래스화됩니다.

Python의 생성자 메서드

생성자 메서드는 다른 메서드와 다릅니다. 객체가 생성되면 생성자 메서드가 즉시 호출됩니다.

일반 메소드 및 특수 생성자 재작성:

상속의 개념을 이해한 후에는 각 클래스가 하나 이상의 슈퍼클래스를 가질 수 있으며 하위 클래스는 상위 클래스에서 상위 클래스의 일부 동작을 상속한다는 것을 알게 됩니다. 그뿐만 아니라, 상속 동작을 사용자 정의하기 위해 일부 슈퍼 클래스 메서드를 재정의할 수도 있습니다.

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print('我在吃')
            self.hungry=False
        else:
            print('我吃饱了,谢谢')
sb=Bird()
sb.eat()
sb.eat()

인쇄 결과:

我在吃
我吃饱了,谢谢

새가 배불리 먹은 후 배고픔 상태가 False로 변경되어 먹기 함수가 호출되면, 배부르다고 인쇄되어 있어요. 감사합니다. 이는 클래스에서 __init__ 함수를 사용하는 것입니다. 확장된 사례를 살펴보겠습니다. 먹는 것은 새의 기본 특성이며, 새는 새의 기본 클래스라고 할 수 있습니다. 이제 노래하는 새를 작성합니다. 왜냐하면 우리는 이미 새 기본 클래스를 작성했고 이제 이를 상속받기만 하면 됩니다. 우리의 새는 기본적으로 노래할 뿐만 아니라 먹는 기술도 배울 것입니다.

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print('ahhh')
            self.hungry=False
        else:
            print('no thanks')

class SongBird(Bird):
    def __init__(self):

        self.sound='Squawk'

    def sing(self):
        print(self.sound)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()

인쇄 결과:

Traceback (most recent call last):
Squawk
  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 20, in <module>
    sb.eat()
  File "F:/Python培训/博客园随笔专用/文件操作/文件读写.py", line 5, in eat
    if self.hungry:
AttributeError: &#39;SongBird&#39; object has no attribute &#39;hungry&#39;

안타깝게도 새가 노래 기능을 실행할 수 있지만 상위 클래스의 식사 기능이 호출되면 예외가 발생합니다. 상위 클래스에 정의된 먹기 기능을 살펴보세요. 먹기 기능을 시작하려면 배고픈 속성을 설정해야 합니다. 그러나 의문스러운 점은 우리가 기본 클래스인 Bird를 상속받았고 Bird도 배고픔을 정의하는데 왜 작동하지 않는다는 것입니다. 이는 배고픈 속성이 상위 클래스가 자체 생성자를 호출할 때만 적용되기 때문입니다. SingBird는 Bird의 모든 기능을 상속하지만 Bird의 초기화 기능을 실행하지는 않는 것을 볼 수 있습니다. 다음 코드를 수정하세요

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print(&#39;ahhh&#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)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()

출력 결과:

Squawk
ahhh
no thanks

SongBird 클래스를 초기화할 때 Bird의 초기화 함수를 호출한다는 것을 코드에서 알 수 있습니다. 따라서 Bird의 생성자가 트리거됩니다. 이제 우리 새들은 노래할 수 있을 뿐만 아니라 기본 종의 먹는 행동도 갖게 되었습니다.

실행 과정을 다시 살펴보세요. SongBird는 자체적으로 초기화되는 동안 자신을 상위 클래스에 매개변수로 전달합니다. 이는 나를 만들 때 나에게 타고난 기술(스스로 먹이를 주는 방법을 아는 것)을 주어야 했다는 것을 상위 클래스에 알리는 것을 의미합니다. 즉, 배고픈 속성이 설정됩니다.

슈퍼 함수 사용

위 방법은 3.0 이전에 작성된 것입니다. 위의 문제를 해결하기 위해 새로운 클래스에서는 슈퍼 함수를 ​​사용할 것입니다.

class Bird:
    def __init__(self):
        self.hungry=True
    def eat(self):
        if self.hungry:
            print(&#39;ahhh&#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)
sb=SongBird()
sb.sing()
sb.eat()
sb.eat()

현재 클래스와 객체가 매개변수로 호출되며, 함수에서 반환된 객체를 호출하는 모든 메소드는 슈퍼 클래스를 호출하는 메소드입니다. 요약: 하위 클래스와 하위 클래스 객체가 명시적으로 전달되고 생성자가 호출되지만 상위 클래스의 생성자는 암시적으로 실행됩니다.

위 내용은 Python의 생성자 메서드 분석(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제