@dildeolupbiten’in bahsettigi temel sebepler disinda, @classmethod
'in varliginin sebebi OOP kurallarinda var olmasi.
Genelde buralarda ornek verirken Insan
diye sinif olusturup isim, yas gibi ozellikler eklerler ama bu sefer gercek bir ornek verecegim:
from dataclasses import dataclass
from typing import Optional
from enum import Enum
from pathlib import Path
import random
class FileFormat(Enum):
JPEG = "JPEG"
PNG = "PNG"
ZIP = "ZIP"
@dataclass
class File:
filename: str
content: bytes
format: Optional[FileFormat]
@classmethod
def new_from_path(cls, path: Path):
content = path.read_bytes()
return cls(
filename=path.name,
content=content,
format=File.detect_format(content)
)
@staticmethod
def detect_format(content: bytes) -> FileFormat:
...
return random.choice([FileFormat.JPEG, FileFormat.PNG, FileFormat.ZIP])
Dosyayi temsil eden File
sinifimiz var. Klasik bir sekilde instance olusturularak kullabilabilir:
File("hello.png", bytes(), FileFormat.PNG)
Ama dosya yolu alan, kalan seyleri dosyayi okuyup otomatik dolduran bir fonksiyona ihtiyac duyabiliriz. Bu durumda classmethod kullaniriz.
File.new_from_path(Path("/path/to/hello.png"))
# File("hello.png", b'PNG...', FileFormat.PNG)
Ya da ne direkt olarak File
sinifiyla ne de File
instance’lariyla alakasi olmayan, ama File
namespace’i icinde bulunmasinin uygun olacagi durumlarda @staticmethod
kullanabiliriz:
with open("hello.png", "rb") as f:
File.detect_format(f.read())
# FileFormat.PNG
Bu kod cok iyi bir ornek oldu classmethod
ve staticmethod
konusunda kafa karisikliklarina. Wiki yapma ozelligi vardi eskiden ama su anda bulamadim, olsa cok iyi olurmus.