クラス属性とクラスメソッド
目的
- クラス構造
- クラス属性とインスタンス属性
- クラスメソッドと静的メソッド
01.クラスの構造
1.1用語-例
1.オブジェクト指向開発を使用して、最初のステップはクラスを設計することです
2.クラス名()を使用してオブジェクトを作成します。オブジェクトの作成には2つのステップがあります。
- メモリ内のオブジェクトにスペースを割り当てます
- 初期化メソッド_init _を呼び出して、オブジェクトを初期化します
3.オブジェクトが作成された後、メモリ内にオブジェクトが実際に存在します-インスタンス
したがって、通常:
- 作成されたオブジェクトは、クラスのインスタンスと呼ばれます
- オブジェクトを作成するアクションはインスタンス化と呼ばれます
- オブジェクトプロパティはインスタンスプロパティと呼ばれます
- オブジェクトによって呼び出されるメソッドは、インスタンスメソッドと呼ばれます
プログラムが実行されるとき:
- 各オブジェクトには独自のインスタンス属性があります
- オブジェクトメソッドを呼び出すと
、自分自身を介して独自のプロパティにアクセスできます。
独自のメソッドを呼び出す
結論として
- 各オブジェクトには独自の独立したメモリスペースがあり、さまざまな属性を保存します
- 複数のオブジェクトのメソッドのメモリ内のコピーは1つだけです。メソッドを呼び出すときは、オブジェクトの参照をメソッドに渡す必要があります。
1.2クラスは特別なオブジェクトです
- Pythonのすべてがオブジェクトです:
クラスAAA:定義されたクラスはクラスオブジェクトに属します
obj1 = AAA()はインスタンスオブジェクトに属します - プログラムの実行中、クラスもメモリにロードされます
- Pythonでは、クラスは特別なオブジェクトです-クラスオブジェクト
- プログラムの実行中、メモリにはクラスオブジェクトのコピーが1つしかなく、1つのクラスを使用して多くのオブジェクトインスタンスを作成できます。
- インスタンスをパッケージ化するプロパティとメソッドに加えて、クラスオブジェクトには独自のプロパティとメソッドがあります。
クラス属性
クラスメソッド - クラスのプロパティにアクセスするか、クラス名を使用してクラスのメソッドを呼び出すことができます。
02.クラス属性とインスタンス属性
2.1コンセプトと使用法
- クラス属性は、クラスオブジェクトで定義された属性です。
- 通常、このクラスに関連する特性を記録するために使用されます
- クラス属性は、特定のオブジェクトの特性を記録するために使用されません
要件の例
- ツールクラスを定義する
- 各ツールには独自の名前があります
- 要件-このクラスを使用して作成されるツールオブジェクトの数を知っていますか?
class Tool(object):
# 使用赋值语句,定义类属性,记录创建工具对象的总数
count = 0
def __init__(self, name):
self.name = name
# 针对类属性做一个计数+1
Tool.count += 1
# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")
# 知道使用 Tool 类到底创建了多少个对象?
print("现在创建了 %d 个工具" % Tool.count)
2.2属性取得メカニズム(科学)
Pythonで属性を取得するための上方参照メカニズムがあります
したがって、クラス属性にアクセスするには2つの方法があります。
- クラス名。クラス属性
- オブジェクト。クラス属性(非推奨)
object.class
属性=値割り当てステートメントを使用する場合、オブジェクトに追加される属性は1つだけであり、クラス属性の値は影響を受けないことに注意してください。
03.クラスメソッドと静的メソッド
3.1クラスメソッド
- クラス属性は、クラスオブジェクトに対して定義された属性です。
代入ステートメントを使用して、classキーワードの下にクラス属性を定義します。クラス属性
は、このクラスに関連する特性を記録するために使用されます。 - クラスメソッドは、クラスオブジェクトに対して定義されたメソッドです。
クラスメソッドでは、クラス属性に直接アクセスしたり、他のクラスメソッドを呼び出したりできます。
構文は次のとおりです
@classmethod
def 类方法名(cls):
pass
- クラスメソッドは、これがクラスメソッドであることをインタプリタに伝えるために、デコレータ@classmethodによって識別される必要があります。
- クラスメソッドの最初のパラメータはclsである必要があります
- どのクラスによって呼び出されるメソッド、メソッド内のclsはどのクラスの参照です
- このパラメーターは、インスタンスメソッドの最初のパラメーターであるselfに似ています。
- 他の名前を使用できることを確認しますが、私はclsの使用に慣れています
1.クラス名を使用してクラスメソッドを呼び出します。メソッドを呼び出すときに、clsパラメーターを渡す必要はありません
。2 。メソッド内
- クラスのプロパティには、clsを介してアクセスできます。
- clsを介して他のクラスメソッドを呼び出すこともできます。
要件の例
- ツールクラスを定義する
- 各ツールには独自の名前があります
- 要件-show_tool_countクラスメソッドをクラスにカプセル化し、現在のクラスを使用して作成されたオブジェクトの数を出力します
@classmethod
def show_tool_count(cls):
"""显示工具对象的总数"""
print("工具对象的总数 %d" % cls.count)
クラスメソッド内では、clsを直接使用して、クラス属性にアクセスしたり、クラスメソッドを呼び出したりできます。
3.2静的メソッド
- 開発中に、メソッドをクラスにカプセル化する必要がある場合、このメソッド:
インスタンスプロパティにアクセスしたりインスタンスメソッドを呼び出し
たりする必要も、クラスプロパティにアクセスしたりクラスメソッドを呼び出したりする必要もありません。 - このとき、このメソッドを静的メソッドにカプセル化できます。
構文は次のとおりです。
@staticmethod
def 静态方法名():
pass
- 静的メソッドは、これが静的メソッドであることをインタプリタに伝えるために、デコレータ@staticmethodによって識別される必要があります。
- クラス名を渡します。静的メソッドを呼び出します。
class Dog(object):
# 狗对象计数
dog_count = 0
@staticmethod
def run():
# 不需要访问实例属性也不需要访问类属性的方法
print("狗在跑...")
def __init__(self, name):
self.name = name
3.3メソッドの包括的なケース
要求する
- ゲームクラスを設計する
- 属性:
クラス属性top_scoreを定義して、ゲームの履歴で最高のスコアを記録し
ます。インスタンス属性player_nameを定義して、現在のゲームのプレーヤーの名前を記録します。 - メソッド:
静的メソッドshow_helpは、ゲームのヘルプ情報を表示します。
クラスメソッドshow_top_scoreは、履歴で最高のスコアを表示します。
メソッドstart_gameの例は、現在のプレーヤーのゲームを開始します。 - プログラムの主な手順
- ヘルプ情報を表示する
- 史上最高のスコアを表示
- ゲームオブジェクトを作成してゲームを開始します
ケースサマリー
- インスタンスメソッド-メソッドの内部はインスタンス属性にアクセスする必要があります
。インスタンスメソッドの内部はクラス名を使用できます。クラス属性へのアクセス - クラスメソッド-メソッド内のクラス属性にアクセスする必要があるだけです
- 静的メソッド-メソッド内では、インスタンス属性とクラス属性にアクセスする必要はありません
メソッドがインスタンス属性とクラス属性にアクセスする必要がある場合、どのメソッドを定義する必要がありますか?
インスタンスメソッドを定義する必要があります
クラスは1つしかないため、インスタンスメソッド内でクラス名を使用できます。クラスプロパティへのアクセス
class Game(object):
# 游戏最高分,类属性
top_score = 0
@staticmethod
def show_help():
print("帮助信息:让僵尸走进房间")
@classmethod
def show_top_score(cls):
print("游戏最高分是 %d" % cls.top_score)
def __init__(self, player_name):
self.player_name = player_name
def start_game(self):
print("[%s] 开始游戏..." % self.player_name)
# 使用类名.修改历史最高分
Game.top_score = 999
# 1. 查看游戏帮助
Game.show_help()
# 2. 查看游戏最高分
Game.show_top_score()
# 3. 创建游戏对象,开始游戏
game = Game("小明")
game.start_game()
# 4. 游戏结束,查看游戏最高分
Game.show_top_score()