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、このクラスに関連するパラメータを渡す必要がないため、このクラスとは何の関係もないメソッドに似ています。その時点で関連するクラスに入れておく方が体系的です。

おすすめ

転載: blog.csdn.net/qq_43219379/article/details/130171243