@classmetod benzeyicisi gerçekten gerekli mi?

@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.

3 Beğeni