独自のクエリの使用状況を記録する
参考
- @classmethod、@staticmethod、@property、クラス デコレータ
- Python の staticmethod デコレータと classmethod デコレータの類似点と相違点
@クラスメソッド
オブジェクト指向 C++ には、クラスまたはインスタンス化されたオブジェクトからアクセスできる、静的に変更された静的メソッドがあります。Python クラスでこれに似ているのが、クラス メソッドである @classmethod です。
例
例は次のとおりです。
class Dog:
# 类属性
dogsum = {
}
def __init__(self, name, gender, age, type) -> None:
self.name = name
self.gender = gender
self._age = age
self.type = type
Dog.dogsum.setdefault(type, 0)
Dog.dogsum[type] += 1
@classmethod
def get_sum(cls, type):
return cls.dogsum[type]
dog = Dog("xiaohei", "male", 5, "tugou")
dog = Dog("xiaohong", "female", 6, "tugou")
dog = Dog("xiaohuang", "male", 7, "taidi")
print(Dog.dogsum)
print(Dog.get_sum("tugou"))
結果:
{'tugou': 2, 'taidi': 1}
2
クラス内にクラス属性 Dogsum を定義して、さまざまなタイプの犬の数を数え、クラスの作成時に Dogsum を変更していることがわかります。この属性はクラス属性であるため、それにアクセスするにはクラス メソッド、つまり get_sum メソッドを定義する必要があります。変更後は@classmethod
、通常のクラスのメソッドと比較して、 パラメータ を渡しませんが、このクラスを表すself
パラメータを渡します。cls
その後、メソッドはクラスから呼び出すことができ、インスタンス化された任意のオブジェクトからも呼び出すことができます。
修飾子を使用せずに@classmethod
、次のことを試してください。
class Dog:
# 类属性
dogsum = {
}
def __init__(self, name, gender, age, type) -> None:
self.name = name
self.gender = gender
self._age = age
self.type = type
Dog.dogsum.setdefault(type, 0)
Dog.dogsum[type] += 1
def get_sum(self, type):
return Dog.dogsum[type]
dog0 = Dog("xiaohei", "male", 5, "tugou")
dog1 = Dog("xiaohong", "female", 6, "tugou")
dog2 = Dog("xiaohuang", "male", 7, "taidi")
print(Dog.dogsum)
print(dog0.get_sum("tugou"), dog1.get_sum("tugou"))
結果:
{'tugou': 2, 'taidi': 1}
2 2
まだ達成可能であることがわかりますが、@classmethod
変更を使用するほど標準化されていません。
@静的メソッド
の場合は@classmethod
、このクラスを表すパラメータを渡す必要がありますcls
が、 の場合は@staticmethod
、このクラスに関連するパラメータを渡す必要がないため、このクラスとは何の関係もないメソッドに似ています。その時点で関連するクラスに入れておく方が体系的です。