クラスメソッド1
@classmethod
クラスのメソッドをパッケージングする方法に意志。
最初の引数として、実施例の方法自体の一例として、第1の引数としての地位へのクラスクラス方法。宣言クラスのメソッドを次のように習慣を使用してください:
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
デコレータなど@classmethodと呼ばれる機能を形成する - 詳細については、関数の定義を参照してください。
自分のクラスのその種外の例としては無視されます。その派生クラスのメソッド呼び出しがクラスに属している場合は最初の引数が暗黙的であるとして、派生クラスのオブジェクトが渡されます。
C ++、Javaクラスのメソッドと静的メソッドまたは異なります。あなたは後者が必要な場合は、staticmethod()を参照してください。
2静的メソッド
@staticmethod
静的メソッドとしての転写方法。
静的メソッドを宣言するには、この構文を使用します
class C:
@staticmethod
def f(arg1, arg2, ...): ...
デコレータなど@staticmethodと呼ばれる機能を形成する - 詳細については、関数の定義を参照してください。
PythonとJavaまたはC ++の静的メソッドでの静的メソッドは似ています。()クラスメソッドを参照してください、別のクラスのコンストラクタバリアントを作成するために使用されます。
すべてのデコレータが好きなように、あなたはまた、従来のstaticmethodと同じ機能を呼び出し、その結果に何らかのアクションを実行することができます。このような機能は、身体からのクラスを参照する必要があり、いくつかのケースでは、あなたは例の方法への自動変換を避けたいです。これらのケースについては、次の構文を使用します。
class C:
builtin_open = staticmethod(open)
静的メソッドの詳細については、標準型の階層を参照してください。
3違い
- 異なる構成:クラスのクラスメソッドは、その第一引数のCLSとして必要ですが、静的メソッドは、暗黙の最初のパラメータ、最初の引数selfと方法の一例の独自のインスタンスを受信しません。
- 方法の例として他の2つは、クラスがまだインスタンスメソッドと静的メソッドを作成した後、直接、クラスに依存して呼び出すことができる一方で、インスタンスの作成後に呼び出す必要があるが使用することができます。
- Javaクラスのコンストラクタは、アナログのJavaコンストラクタを複数定義した場合に、Pythonのクラスのメソッドをオーバーロードすることができます。
- インスタンスが作成された後、さらに新しい静的メソッドを作成せずに設計されたクラスとインスタンスが親クラスを使用して、呼び出すことができるようstaticメソッドは、PythonとJavaを使用しています。
- 静的メソッドシナリオ:あなたは純粋にパラメータを渡すことによって、メソッド内の任意のインスタンスメソッドとプロパティにアクセスし、データの機能方法を返す、それは静的メソッドに適していない場合が定義されている、それはオブジェクトのインスタンス化のオーバーヘッドを節約モジュール層の存在の機能は問題ありませんが、カテゴリに、サービスの唯一のタイプとして、コスト、このメソッドは、クラスの外側にあることが多いです。
- メソッドクラス使用シナリオ:1は、オブジェクトのインスタンスを作成するためにファクトリメソッドとして、例えば、内蔵された広く日付オブジェクトを作成するために、ファクトリメソッドとして使用モジュールdatetime.dateクラスクラス方法。あなたはクラス内の静的メソッドを呼び出したい場合は、静的メソッドとして定義されている場合は、あなたが明示的にクラスAを参照する必要があるため2は、その後、クラスメソッドとして定義された方法は、適当であり、これは、継承のために良いことではありません。
# coding:utf-8
class Foo(object):
"""类三种方法语法形式"""
x,y = 10,14
def instance_method(self):
pass
@staticmethod
def static_method_averag(*mixes):
return sum(mixes) / len(mixes)
@classmethod
def class_method(cls):
return cls.static_method_averag(cls.x,cls.y)
foo = Foo()
# 调用关系
# foo.instance_method()
# foo.static_method_averag(1,2,3)
# foo.class_method()
# print('----------------')
# Foo.static_method_averag(1,2,3)
# Foo.class_method()
# print('----------------')
# 内存关系
print(Foo.static_method_averag is foo.static_method_averag) #静态方法不会动
print(Foo.class_method is foo.class_method)
print(Foo.instance_method is foo.instance_method) #实例化后 实例绑定这个方法
参考:
https://zhuanlan.zhihu.com/p/28010894
https://docs.python.org/zh-cn/3/index.html