Python OOP #3 – Classmethod ve Staticmethod

Nesne yerine sınıfa bağlı olan metodlara “class method” yani sınıf metodu denir. Parametreleri sınıflardan oluşur. Programımıza bir classmethod ekleyelim:

@classmethod
def set_raise_amount(cls, amount):
    cls.raise_amount = amount

Fark ettiyseniz metodu tanımlarken @classmethod etiketi kullandım. Bu kullanımı daha iyi anlamak için decoratorlarla ilgili olan yazımı inceleyebilirsiniz. Metodumu çağırırken normal bir fonksiyon çağırır gibi çağırıyorum.

Employee.set_raise_amount(1.05)

print(Employee.raise_amount)
print(emp1.raise_amount)

Çıktı iki tane 1.05 şeklinde olur çünkü artık sınıflarla çalışıyoruz. Bu nedenle sınıf değişkeninde yaptığım bir değişiklik nesneleri de etkileyecektir. Daha önceki yazımda bundan bahsetmiştim.

Fonksiyonun tanımını incelersem bizim alışık olduğumuz self yerine cls parametresine sahip olduğunu görürüm. Bu argüman olarak sınıf aldığını belirtmek için kullanılır. cls yerine başka bir şey de yazabilirdim ancak geleneksel kullanım bu şekilde.

Fonksiyonu çağırdığımda sınıf adı otomatik olarak cls parametresine verilir. İkinci parametre olan amount değişkeni sınıfa ait raise_amount değişkenine atanır.

Sınıf metodları çoklu nesne oluşturmak için de kullanılabilir. Bu örnekte string olarak verilen işçilere ait özellikler ile tek tek örnek oluşturmak yerine bir classmethod yardımıyla bu işlemi tek seferde yapıyoruz.

@classmethod
def from_string(cls, emp_str):
    fname, lname, pay = emp_str.split("-")
    return cls(fname, lname, pay)

emp3 = Employee.from_string("John-Doe-7000")

Eğer bu metodu kullanmasaydım şöyle bir tanımlama yapmam gerekecekti ve her bir string için ayrı ayrı örnekleme yapacaktım.

emp_str1 = "John-Doe-7000"
emp_str2 = "Steve-Smith-6000"
emp_str3 = "Jane-Doe-9000"

first, last, pay = emp_str1.split("-")

new_emp1 = Employee(first, last, pay)

Normal metodlar örnekleri ilk argüman olarak alır (self), sınıf metodları sınıfları ilk argüman olarak alır (cls), static metodlar hiçbirini ilk argüman olarak almaz. Yani oluşturduğunuz metod ne sınıf ne de nesne kullanmıyor sadece aldığı argümanlar ile ilgileniyorsa bu durumda static metodları kullanmalısınız.

Sınıf ve örneklerle hiçbir ilgisi olmayan is_weekday() metodu oluşturacağım:

@staticmethod
def is_workday(day):
    if day.weekday() == 5 or day.weekday() == 6:
        return False
    return True

Bu metod çalışmak için herhangi bir örneğe veya sınıfa ihtiyaç duymuyor. Sadece argüman olarak aldığı tarih değerinin çalışma günü olup olmadığını kontrol ediyor ve ona göre True veya False döndürüyor. Kodumuzun tamamı şu şekilde:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Employee():

    number_of_emps = 0
    raise_amount = 1.04

    def __init__(self, fname, lname, pay):
        self.fname = fname
        self.lname = lname
        self.pay = pay
        self.mail = fname + "." + lname + "@company.com"

        Employee.number_of_emps += 1

    def fullname(self):
        return self.fname + " " + self.lname

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amount)

    @classmethod
    def set_raise_amount(cls, amount):
        cls.raise_amount = amount

    @classmethod
    def from_string(cls, emp_str):
        fname, lname, pay = emp_str.split("-")
        return cls(fname, lname, pay)

    @staticmethod
    def is_workday(day):
        if day.weekday() == 5 or day.weekday() == 6:
            return False
        return True

emp1 = Employee("Bob", "Hawkes", 5000)
emp2 = Employee("Alice", "Banas", 3500)

Employee.set_raise_amount(1.05)

print(Employee.raise_amount)
print(emp1.raise_amount)

emp3 = Employee.from_string("John-Doe-7000")
print(emp3.mail)

import datetime
date = datetime.date(2017, 6, 30)

print(Employee.is_workday(date))

Serinin diğer yazıları:
1 – Sınıflar ve Örnekleme
2 – Sınıf Değişkenleri

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s