私はマシンの正常性統計を返すクラスを持っています。Python - staticmethod vs classmethod
class HealthMonitor(object):
"""Various HealthMonitor methods."""
@classmethod
def get_uptime(cls):
"""Get the uptime of the system."""
return uptime()
@classmethod
def detect_platform(cls):
"""Platform detection."""
return platform.system()
@classmethod
def get_cpu_usage(cls):
"""Return CPU percentage of each core."""
return psutil.cpu_percent(interval=1, percpu=True)
@classmethod
def get_memory_usage(cls):
"""Return current memory usage of a machine."""
memory = psutil.virtual_memory()
return {
'used': memory.used,
'total': memory.total,
'available': memory.available,
'free': memory.free,
'percentage': memory.percentage
}
@classmethod
def get_stats(cls):
return {
'memory_usage': cls.get_memory_usage(),
'uptime': cls.uptime(),
'cpu_usage': cls.get_cpu_usage(),
'security_logs': cls.get_windows_security_logs()
}
get_stats
はクラス外から呼び出されます。これは、関連する関数を定義する正しい方法です。 classmethods
またはstaticmethods
を使用するか、クラスのオブジェクトを作成してget_stats
を呼び出します。
私はその相違点について十分に読んだことがありますが、例で私の理解を明確にしたいと思います。どちらがもっとpythonicなアプローチですか?
正直な質問:なぜあなたはクラスをまったく使っていますか?これまでインスタンス化しているとは思われません。私はどんな状態も見ません。なぜ機能のコレクションだけではないのですか? – glibdud
'@ classmethod'と' @ staticmethod'は異なるものです。彼らは交換できません。 '@ staticmethod'はクラスと関数を論理的にグループ化したいが、関数は状態を必要としないときに使うべきです。 '@ classmethod'は、他の言語のオーバーロードされたコンストラクタとして考えることができます。 –
@glibdud - 私は特定のクラスの特定のドメインの機能をグループ化する方が好きです。 – PythonEnthusiast