Pythonのオブジェクト指向メソッドの違い

爱喝马黛茶的安东尼
リリース: 2019-06-24 13:49:16
オリジナル
2875 人が閲覧しました

Python は最初からオブジェクト指向言語であるため、Python でクラスやオブジェクトを作成するのは簡単です。

メソッドには、インスタンス メソッド、静的メソッド、クラス メソッドが含まれます。3 つのメソッドはすべてメモリ内のクラスに属します。違いは呼び出しメソッドにあります。

インスタンス メソッド: オブジェクトによって呼び出されます。少なくとも 1 つの self パラメータ。通常のメソッドを実行すると、メソッドを呼び出すオブジェクトが自動的に self に割り当てられます。

クラス メソッド: クラスによって呼び出されます。 ; 少なくとも 1 つの cls パラメータ; クラス メソッドを実行すると、メソッドを呼び出すクラスが自動的に cls にコピーされます;

静的メソッド: クラスによって呼び出されます; デフォルトのパラメータはありません。

Pythonのオブジェクト指向メソッドの違い

インスタンス メソッド

class Kls(object):
    def __init__(self, data):
        self.data = data
    def printd(self):
        print(self.data)
ik1 = Kls('leo')
ik2 = Kls('lee')
ik1.printd()
ik2.printd()
ログイン後にコピー

出力:

leo 
lee
ログイン後にコピー

上記の例では、printd はインスタンスメソッド。インスタンス メソッドの最初のパラメータは self です。ik1.printd() を使用してインスタンス メソッドが呼び出されるとき、インスタンス ik1 が self パラメータに渡されるため、self パラメータは現在インスタンスを呼び出しているインスタンスを参照できます。方法。インスタンス メソッドのこの機能を利用して、上記のコードは 2 つのインスタンスのメンバー データを正しく出力します。

関連する推奨事項: 「Python ビデオ チュートリアル

クラス メソッド

Python のクラス メソッドは、デコレータ @classmethod を使用します。定義を見てみましょう。例を直接見てみましょう。

class Kls(object):
    num_inst = 0
    def __init__(self):
        Kls.num_inst = Kls.num_inst + 1
    @classmethod
    def get_no_of_instance(cls):
        return cls.num_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()
ログイン後にコピー

出力:

2 
2
ログイン後にコピー

上の例では、クラス Kls のインスタンスの数をカウントする必要があるため、インスタンスの数を格納するためにクラス変数 num_inst が定義されています。デコレーター @classmethod の使用により、メソッド get_no_of_instance がクラス メソッドとして定義されます。クラス メソッドを呼び出すとき、Python はクラス (クラス Kls) を cls に渡し、クラス変数 num_inst が get_no_of_instance 内で参照できるようにします。

クラス メソッドを呼び出すときは、型そのものをクラス メソッドに渡すだけでよいため、クラス メソッドはクラス経由でもインスタンス経由でも呼び出すことができます。

静的メソッド

開発では、クラスに関連するいくつかのメソッドを定義する必要があることがよくありますが、実装中にクラスやインスタンスを参照する必要はありません。たとえば、環境変数を設定したり、別のクラスの変数を変更したりするなどです。現時点では、静的メソッドを使用できます。

Python は、デコレーター @staticmethod を使用して静的メソッドを定義します。

IND = 'ON'

class Kls(object):
    def __init__(self, data):
        self.data = data
    @staticmethod
    def checkind():
        return IND == 'ON'
    def do_reset(self):
        if self.checkind():
            print('Reset done for: %s' % self.data)
    def set_db(self):
        if self.checkind():
            print('DB connection made for: %s' % self.data)
ik1 = Kls(24)
ik1.do_reset()
ik1.set_db()
ログイン後にコピー

出力:

Reset done for: 24 
DB connection made for: 24
ログイン後にコピー

コードでは、グローバル変数 IND を定義します。IND はクラス Kls に関連しているため、メソッド Checkind はクラス Kls に配置および定義されます。 checkind メソッドはクラスやインスタンスを参照せずに IND の値を確認するだけでよいため、静的メソッドとして定義します。

静的メソッドの場合、Python はクラスやインスタンスを渡す必要がないため、クラスまたはインスタンスを使用して静的メソッドを呼び出すことができます。

インスタンス メソッド、クラス メソッド、静的メソッドの違い

コードを使用して、インスタンス メソッド、クラス メソッド、静的メソッドの違いを説明します。次のコード内のメソッド foo、class_foo、および static_foo の定義と使用に注意してください。

class Kls(object):
    def foo(self, x):
        print('executing foo(%s,%s)' % (self, x))
    @classmethod
    def class_foo(cls,x):
        print('executing class_foo(%s,%s)' % (cls,x))
    @staticmethod
    def static_foo(x):
        print('executing static_foo(%s)' % x)
ik = Kls()
# 实例方法
ik.foo(1)
print(ik.foo)
print('==========================================')
# 类方法
ik.class_foo(1)
Kls.class_foo(1)
print(ik.class_foo)
print('==========================================')
# 静态方法
ik.static_foo(1)
Kls.static_foo('hi')
print(ik.static_foo)
ログイン後にコピー

出力:

executing foo(<__main__.Kls object at 0x0551E190>,1)
<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
==========================================
executing class_foo(<class &#39;__main__.Kls&#39;>,1)
executing class_foo(<class &#39;__main__.Kls&#39;>,1)
<bound method type.class_foo of <class &#39;__main__.Kls&#39;>>
==========================================
executing static_foo(1)
executing static_foo(hi)
<function static_foo at 0x055238B0>
ログイン後にコピー

インスタンス メソッドの場合、呼び出し時にインスタンス ik が最初のパラメーターとして self パラメーターに渡されます。したがって、ik.foo(1) を呼び出すと、インスタンス ik のアドレスが出力されます。

クラス メソッドの場合、呼び出し時にクラス Kls が最初のパラメータとして cls パラメータに渡されます。したがって、ik.class_foo(1) を呼び出すと、Kls の型情報が出力されます。

前述したように、クラスメソッドはクラスまたはインスタンスを通じて呼び出すことができますが、上記のコードでそれを再度確認しました。

静的メソッドの場合、呼び出し時にクラスまたはインスタンスを渡す必要はありません。実際、静的メソッドはクラスまたはインスタンスを通じて呼び出すことができる点を除けば、クラスの外で定義する関数と非常によく似ています。

上記の例では、foo は単なる関数ですが、ik.foo を呼び出すと、インスタンス ik にバインドされた関数が取得されることに注意してください。 foo の呼び出しには 2 つの引数が必要ですが、ik.foo の呼び出しには引数が 1 つだけ必要です。 foo は ik にバインドされているため、ik.foo を出力すると、次の出力が表示されます。

<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
ログイン後にコピー

ik.class_foo が呼び出されるとき、class_foo はクラス メソッドであるため、class_foo は Kls Bind にバインドされます (代わりにik へのバインディングの)。 ik.class_foo を出力すると、出力は次のようになります。

<bound method type.class_foo of <class &#39;__main__.Kls&#39;>>
ログイン後にコピー

ik.static_foo を呼び出すとき、静的メソッドはクラスまたはインスタンスにバインドされないため、ik.static_foo (または Kls.static_foo) を出力するときは、出力:

<function static_foo at 0x055238B0>
ログイン後にコピー

要約すると、クラスにバインドするかインスタンスにバインドするか、これがインスタンス メソッド、クラス メソッド、静的メソッドの違いです。

以上がPythonのオブジェクト指向メソッドの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート