クラスメソドをやっていきましょう。
Contents
普通のクラスと使い方
インスタンス(オブジェクト)を作るときに、カッコを付けるのが普通ですが、カッコをつけない場合は、アトリビュートにアクセスできなくなります。
オブジェクト内のグローバル変数的な意味合いのある”クラス変数”にはアクセスできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# クラスを作成 class Person(object): kind = 'human' def __init__(self): self.x=100 def what_is_your_kind(self): return self.kind # インスタンス(オブジェクト)の作成 kenji=Person() # <__main__.Person object at 0x0000023F76513828> # カッコをつけないとclassのまま オブジェクトではない kenji2=Person # <class '__main__.Person'> # __init__で定義したアトリビュートを確認する print(kenji.x) # 100 """オブジェクトになっていないので無理です。 print(kenji2.x) # エラー:AttributeError: type object 'Person' has no attribute 'x' """ #クラス変数を確認する オブジェクトの中のグルーバル変数のようなもの。 #なので、kenji2 も kind にはアクセスできる。 print(kenji.kind) # human print(kenji2.kind) # human #メソドを使用できるか確認する print(kenji.what_is_your_kind()) """こちらもオブジェクトになっていないので無理です。 print(kenji2.what_is_your_kind()) # TypeError: what_is_your_kind() missing 1 required positional argument: 'self' """ |
本題:クラスメソド @classmethod
カッコをつけてオブジェクト化していなくても、アトリビュートにアクセスできるようにクラスメソドを使います。
やり方:
(1)メソドの前行に @classmethod とマーキングする。
(2)メソドの引数self を clsに変更する。cls = classの意味
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ここからが本題:クラスメソド #オブジェクト化していなくて使えるようにしてみよう。 #(1)メソドの前行に @classmethod とマーキングする。 #(2)メソドの引数self を clsに変更する。cls = classの意味 class Person(object): kind = 'human' def __init__(self): self.x=100 @classmethod def what_is_your_kind(cls): return cls.kind # 動作確認 kenji3 = Person print(kenji3) # <class '__main__.Person'> print(kenji3.kind) # human print(kenji3.what_is_your_kind()) # human ちゃんと出力できた。 |
kenji3はクラスのままでオブジェクト化されていませんが、@classmethodでマーキングしたメソドはちゃんと使えるようになりました。
次回はスタティックメソド @staticmethod をやってみます。
The following two tabs change content below.
Keita N
最新記事 by Keita N (全て見る)
- 2024/1/13 ビットコインETFの取引開始:新たな時代の幕開け - 2024年1月13日
- 2024/1/5 日本ビジネスにおける変革の必要性とその方向性 - 2024年1月6日
- 2024/1/3 アメリカ債権ETFの見通しと最新動向 - 2024年1月3日