Pythonの「クラスメソッド」および「インスタンスメソッド」とは何ですか?
「インスタンスメソッド」は、インスタンスに含まれる情報を使用して、どの値を返す(またはどの副作用を行う)かを判断します。これらは非常に一般的です。
「クラスメソッド」は、クラスの情報(そのクラスのインスタンスではなく)を使用して、その動作に影響を与えます(通常、代替インスタンスとして新しいインスタンスを作成するために使用されるため、あまり一般的ではありません)。
「静的メソッド」は、クラスまたはインスタンスに関する情報を使用して、その動作を計算しません。通常は、便宜上クラスに含まれています。(したがって、これらはあまり一般的でもありません。)
Xの関数
数学クラス、「yはxの関数f(x)
ですか?」コードでそれを適用しましょう:
y = function(x)
上記のことは、変更されるx
可能性があるため、y
変更されるとx
変更される可能性があることを意味しています。私たちは「と言うとき、これは何を意味するかであるy
の関数ですx
」
何をされますy
際にもz
ありますか1
?2
?'FooBarBaz'
?
y
はの関数ではないz
ため、z
何でもかまいませんfunction
が、純粋な関数であると仮定すると、関数の結果に影響を与えません。(z
グローバル変数としてアクセスする場合、それは純粋な関数ではありません-これは関数の純粋さを意味します。)
次の説明を読むときは、上記のことに留意してください。
インスタンスメソッド
インスタンスメソッドは、インスタンスの関数である関数です。関数はインスタンスを引数として暗黙的に受け入れ、インスタンスは関数の出力を決定するために関数によって使用されます。
インスタンスメソッドの組み込み例はstr.lowerです。
>>> 'ABC'.lower()
'abc'
str.lower
文字列のインスタンスで呼び出され、インスタンスに含まれる情報を使用して、どの新しい文字列を返すかを判断します。
クラスメソッド:
Pythonでは、すべてがオブジェクトであることに注意してください。つまり、クラスはオブジェクトであり、関数への引数として渡すことができます。
クラスメソッドは、関数である関数であるのクラス。クラスを引数として受け入れます。
組み込みの例はdict.fromkeys
次のとおりです。
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
関数はそれ自身のクラスを暗黙的に知っており、関数はクラスを使用して関数の出力に影響を与え、反復可能からそのクラスの新しいクラスを作成します。同じメソッドを使用する場合、OrderedDictはこれを示します。
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
クラスメソッドは、そのクラスのインスタンスではなく、クラスに関する情報を使用して、返されるクラスのタイプに影響を与えます。
静的メソッド
「クラスを知らない」メソッドに言及します-これはPythonの静的メソッドです。クラスオブジェクトに便宜上添付されているだけです。オプションで別のモジュールの別の関数にすることもできますが、その呼び出しシグネチャは同じです。
静的メソッドは、クラスでもオブジェクトでもない関数です。
静的メソッドの組み込み例は、Python 3のstr.maketransです。
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
いくつかの引数が与えられると、クラスの関数ではない辞書を作成します。
str
グローバル名前空間で常に利用可能であるため便利であり、translate関数で簡単に使用できます。
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Python 2では、string
モジュールからアクセスする必要があります。
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'str' has no attribute 'maketrans'
>>> import string
>>> 'abracadabra'.translate(string.maketrans('abc', 'bca'))
'bcrbabdbcrb'
例
class AClass(object):
"""In Python, a class may have several types of methods:
instance methods, class methods, and static methods
"""
def an_instance_method(self, x, y, z=None):
"""this is a function of the instance of the object
self is the object's instance
"""
return self.a_class_method(x, y)
@classmethod
def a_class_method(cls, x, y, z=None):
"""this is a function of the class of the object
cls is the object's class
"""
return cls.a_static_method(x, y, z=z)
@staticmethod
def a_static_method(x, y, z=None):
"""this is neither a function of the instance or class to
which it is attached
"""
return x, y, z
インスタンス化しましょう:
>>> instance = AClass()
これで、インスタンスはすべてのメソッドを呼び出すことができます。
>>> instance.an_instance_method('x', 'y')
('x', 'y', None)
>>> instance.a_static_method('x', 'y')
('x', 'y', None)
>>> instance.a_class_method('x', 'y')
('x', 'y', None)
ただし、クラスは通常、インスタンスメソッドを呼び出すことを意図していませんが、他のメソッドを呼び出すことが期待されています。
>>> AClass.a_class_method('x', 'y')
('x', 'y', None)
>>> AClass.a_static_method('x', 'y')
('x', 'y', None)
>>> AClass.an_instance_method('x', 'y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an_instance_method() missing 1 required positional argument: 'y'
インスタンスメソッドを呼び出すには、インスタンスを明示的に渡す必要があります。
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)