🐙
Python100本ノック#9 クラスメソッド(classmethod)とスタティックメソッド(staticmethod)
クラス属性(Class Attributes)
属性はインスタンス属性とクラス属性の2種類が存在する。
クラス属性はクラス内で定義された属性のことであり、同じクラスの全インスタンスに共用される。
class Person(object):
# クラス属性count
count = 0
# 初期化
def __init__(self, name):
self.name = name
# インスタンス数をカウントするための処理
Person.count += 1
# 1、インスタンス化
p1 = Person('Tom')
p2 = Person('Harry')
p3 = Person('Jennifer')
# 2、クラス属性を確認する。
print(f'インスタンスの合計数は{Person.count}')
output
インスタンスの合計数は3
クラスメソッド(classmethod)
インスタンス化しなくても呼び出せるメソッドのことである。その特徴から主にクラス属性とその他のクラスを操作する際に利用される。
メソッド前に@classmethod
デコレータを利用して修飾する。
クラス名.クラスメソッド名()
で呼び出すことができる。
クラスメソッドの第一引数はclsと表し、clsはクラス(class)を意味する。インスタンスを生成しなくても用いることができ、インスタンスを意味するselfを引数に使う必要はない。
具体例
class Tool(object):
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
# クラスメソッドでカプセル化
@classmethod
def get_count(cls):
print(f'インスタンス化したツールの数は{cls.count}')
t1 = Tool('ハンマー')
t2 = Tool('ドリル')
t3 = Tool('ニッパー')
Tool.get_count()
output
インスタンス化したツールの数は3
スタティックメソッド(staticmethod)
インスタンス変数やクラス変数にアクセスできない、独立されているメソッドである。
クラスメソッドと違ってデフォルトの第一引数は存在しない。
メソッド前に@staticmethod
デコレータを利用して修飾する。
用途についてはっきりわかっていないね。今後の勉強で実際に使うことがあったら理解を深めようとした。
具体例
class Test(object):
@classmethod
def clametho(*args):
return args
@staticmethod
def stametho(*args):
return args
def test_method(*args):
return args
print(Test.clametho())
print(Test.clametho('value'))
print(Test.stametho())
print(Test.stametho('value'))
print(test_method())
print(test_method('value'))
output
staticmethod は通常のメソッドは同じ動きになる。OOPでは特定のクラスにしかない特徴を定義するために利用するものかなと思う。
(<class '__main__.Test'>,)
(<class '__main__.Test'>, 'value')
()
('value',)
()
('value',)
Discussion