JY-CONTENTS

JY

JY-CONTENTS
search

+

MENU

【Python】クラスメソッドとスタティックメソッド ②

【Python】クラスメソッドとスタティックメソッド ②

(DATE)

-

2018.01.28

(CATEGORY)

-

classmethod

クラスメソッドは、インスタンスメソッドが暗黙の第一引数としてインスタンスをとるように、第一引数としてクラスをとります。
(クラス自身が暗黙的に第一引数として挿入される)
クラスメソッドの宣言は下記になります。

class Sample:
    @classmethod
    def func(cls, arg1, arg2, ...): ...

2行目の「classmethod」をデコレータとして置きます。
3行目の関数「func」の第1パラメータがクラスになります。

例1

class Sample(object):
    @classmethod
    def func(*args):
        print(*args)
 
Sample.func("abc")
'''
第1引数には必ずクラスオブジェクトがくる
表示 <class '__main__.Sample'> abc
'''

インスタンスメソッドの場合も暗黙的に第一引数にインスタンスが挿入され、第一引数を self とするのがきまりとなっているように classmethod を使う場合もそれと同じように、第一引数を「cls」とすることがルールとなっています(他の名前をつけても文法的なエラーで出ません)。

例2

class Sample(object):
    @classmethod
    def func(cls, a):
        print(a + ' sam')
 
Sample.func("abc")
 
#表示
#abc sam

インスタンス変数にはインスタンスメソッドからしかアクセスできません。
クラスメソッドの第1引数にselfを書いてもクラス変数を参照しようとするだけで、インスタンス変数は参照しません。

class Sam(object):
    name1 = "山田"
    name2 = "太郎"
     
    def __init__(self, a=10):
        #インスタンス変数
        self.a = a
 
    #インスタンスメソッド
    def get_name_ins(self):
        return self.a
 
    #クラスメソッド
    @classmethod
    def get_name_cls(cls):
    #def get_name_cls(self):
        return cls.name1
        #return self.a エラー
 
 
a = Sam()
print(a.get_name_ins())
print(a.get_name_cls())
 
#表示
#10
#山田

staticmethod

スタティックメソッドはクラスメソッドの第二引数以下だけの場合と同じです。
第1引数に「self」や「cls」は渡されません。

class Sam(object):
    name1 = "山田"
    name2 = "太郎"
     
    def __init__(self, a=10):
        #インスタンス変数
        self.a = a
 
    #スタディックメソッド
    @staticmethod
    def get_name_sta(arg):
        return Sam.name1 + arg
 
 
a = Sam()
print(a.get_name_sta('孝之'))
 
#表示
#山田孝之

クラス変数へのアクセス

インスタンスメソッド、クラスメソッド、スタティックメソッドとすべてのメソッドでクラス変数にアクセスできます。

class Sam(object):
    name1 = "山田"
    name2 = "太郎"
     
    def __init__(self, a=10):
        #インスタンス変数
        self.a = a
 
    #インスタンスメソッド
    def get_name_ins(self):
        return Sam.name1
 
    #クラスメソッド
    @classmethod
    def get_name_cls(cls):
        return Sam.name1
 
    #スタディックメソッド
    @staticmethod
    def get_name_sta():
        return Sam.name1
 
 
a = Sam()
print(a.get_name_ins())
print(a.get_name_cls())
print(a.get_name_sta())
 
#表示
#山田
#山田
#山田

NEW TOPICS

/ ニュー & アップデート

SEE ALSO

/ 似た記事を見る

JY CONTENTS UNIQUE BLOG

search-menu search-menu