我有一個類,它返回機器的運行狀況統計信息。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