ホームページ  >  記事  >  バックエンド開発  >  Python のコンストラクター メソッドの分析 (例付き)

Python のコンストラクター メソッドの分析 (例付き)

不言
不言転載
2018-10-10 16:00:053105ブラウズ

この記事の内容は Python による構文解析に関するものです (例付き)。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

Python では、__init__(self) のように関数名の前後に二重アンダースコアが付いていますが、このタイプの記述は Python では特別な意味を持ちます。オブジェクトがこれらのメソッドのいずれかを使用する場合、そのメソッドは特別な状況下で実行されますが、そのようなメソッドが直接呼び出されることはほとんどありません。

古いバージョンの Python コードと互換性を持たせる必要がない場合は、すべてのクラスを新しいスタイルのクラスとして記述し、コードを記述するときにスーパー関数などの機能を使用する必要があります。

Python 3.0 には「古いスタイル」クラスはなく、Object をサブクラス化したり、メタクラスを type (コードの開始行 __metaclass__=type) に設定したりする必要はありません。オブジェクトのサブクラス。明示的なスーパークラスがない場合は直接サブクラス化され、それ以外の場合は間接的にサブクラス化されます。

Python のコンストラクター メソッド

コンストラクター メソッドは他のメソッドとは異なり、オブジェクトが作成されるとすぐに呼び出されます。

一般メソッドと特別な構築メソッドを書き直す:

継承の概念を理解すると、各クラスが 1 つ以上のスーパークラスを持つことができ、サブクラスが親クラスから継承することがわかります。親クラスの。それだけでなく、いくつかのスーパークラス メソッドをオーバーライドして継承動作をカスタマイズすることもできます。

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()

出力結果:

我在吃
我吃饱了,谢谢

コードから、鳥が満腹になった後、空腹状態を Flase に変更します。鳥が満腹であることを意味します。eat 関数が呼び出されると、満腹であることが表示されます。ありがとうございます。これは、クラスで __init__ 関数を使用することによって行われます。拡張されたケースを見てみましょう。食べることは鳥の基本的な特徴であり、Bird は鳥の基本クラスとみなすことができます。ここで、歌う鳥を書きます。すでに鳥の基本クラスを書いているので、あとはそれを継承するだけです。鳥は歌うだけでなく、デフォルトで食べるスキルも学習します。

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;

残念なことに、私たちの鳥はさえずり機能をトリガーする可能性があります。 、しかし、親クラスの食べる関数が呼び出されるとき、例外がスローされます。親クラスで定義されているeat関数を見ると、eat関数を開始するにはhungry属性を設定する必要があります。しかし、不可解なのは、基本クラス Bird を継承しており、Bird は空腹を定義しているのに、なぜ機能しないのかということです。これは、hung 属性は、親クラスが独自のコンストラクターを呼び出した場合にのみ有効になるためです。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。