SORU
29 AĞUSTOS 2012, ÇARŞAMBA


Python @classmethod ve @acemi için staticmethod?

Biliyorum orada pek çok kaynak bu konuda, ama beri İngilizce benim ana dili ve bu benim ilk gün Python, biraz yardıma ihtiyacım var: birisi bana açıklar anlamı @classmethod @staticmethod? Sadece fark, ama aynı zamanda anlamını bilmek istiyorum. Bazı belgeler ile okudum, ama ben tam anlamıyla anlayamadım. Eğer birisi bana net bir tanım ve bir örnek verebilir eğer, bu harika olurdu - ben en iyi örnek öğrenmek.

Bildiğim kadarıyla ben alt sınıfların içine kalıtsal olması gereken bir yöntem olduğunu, ya da..., @classmethod a sınıfı söyler anlamak bir şey. Ancak, bunun anlamı ne? Neden sadece @classmethod @staticmethod @ herhangi tanımlar eklemeden sınıf yöntemi tanımlamak değil mi?

tl;dr:ne zamanonları kullanmalıyım,nedenonları kullanın ve gerekirnasılonları kullanmalı mıyım?

C ile oldukça gelişmiş ben , daha ileri programlama kavramlarını kullanarak bir sorun olacağını sanmıyorum. Mümkünse bana uygun bir C örnek vermekten çekinmeyin.

CEVAP
29 AĞUSTOS 2012, ÇARŞAMBA


Gerçi classmethod staticmethod oldukça benzer, orada hafif bir fark kullanım için her iki taraftan: classmethod olmalı başvuru için bir sınıf nesnesi olarak ilk parametre, oysa staticmethod var * herhangi bir parametre.

Hadi gerçek örneklerde olduğu söylenen bir bak.

Demirbaş

Hadi bir sınıfın bir örneği, tarih bilgileri (bu yemek bizim klişe olacak Nedir) İle İlgili varsayalım:

class Date(object):

    day = 0
    month = 0
    year = 0

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

Bu sınıf, belli ki belirli bir tarih (saat dilimi bilgileri; hadi tüm tarihler UTC sunulmuştur farz olmadan) hakkında bilgi depolamak için kullanılabilir.

Burada __init__, tipik bir başlatıcı Python sınıf örnekleri, aldığı bağımsız olarak tipik bir instancemethod sahip olmayan ilk isteğe bağlı bağımsız değişken (self) bu tutar başvuru için bir yeni oluşturulan örnek.

Sınıf Yöntemi

Aferin classmethods kullanarak bazı görevler var.

Date sınıf örneklerini güncel bilgi dış kaynak gelecek biçiminde bir dize olarak kodlanmış gelen bir sürü oluşturmak istediğimizi varsayalım ('dd-mm-yyyy'). Biz bizim kaynak kodu farklı yerlerde bunu yapmak projesi var.

Yani burada yapmamız gereken şu:

  1. Üç tamsayı değişken veya 3 öğe değişken oluşan bir demet olarak gün, ay ve yıl almak için bir dize ayrıştırmak.
  2. Başlatma çağrısı bu değerleri geçirerek Date başlatılamadı.

Bu gibi görünecektir:

day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)

Bu amaçla, C aşırı yükleme gibi bir özelliği vardır, ama burada classmethod kaybettiğinde çok özelliği - Python yoksun. Başka bir oluştur "kurucu".

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

date2 = Date.from_string('11-09-2012')

Haydi, biraz daha dikkatli bir şekilde uygulanması yukarıda bak, burada ne var inceleme:

  1. Bir yerde tarih dize ayrıştırma uyguladık ve yeniden kullanılabilir.
  2. Saklama sorun burada (eğer tek bir işlevi başka bir yerde gibi dize ayrıştırma uygulamak olabileceğini düşünüyorsanız, bu çözüm çok daha iyi OOP kalıplara uygun) çalışır.
  3. cls tutan bir nesnesınıf kendisibu sınıfın bir örneği değil. Eğer Date bizim dersimiz miras, bütün çocuklar from_string de tanımlanmış olacak, çünkü çok güzel.

Statik yöntem

Ne staticmethod? classmethod oldukça benzer, ama herhangi bir zorunlu parametreleri (sınıfı bir yöntem veya örnek yöntemi gibi) almaz.

Bir sonraki kullanım örneği inceleyelim.

Bir şekilde doğrulamak için istediğimiz bir tarih dizesi var. Bu görevi de mantıken şimdiye kadar kullandık Date sınıf bağlıdır, ama yine de örnekleme gerektirmez.

*30 faydalı olabilir. Hadi bir sonraki kod parçası bak:

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999

    # usage:
    is_date = Date.is_date_valid('11-09-2012')

Bu yüzden, olarak görebiliriz kullanım staticmethod bir şeyimiz yok, herhangi bir erişim için ne sınıftır - temelde sadece bir işlevi, sözdizimsel olarak adlandırılan bir yöntem, ama olmadan erişmek için nesnenin ve iç (alanlara ve başka bir yöntem), süre classmethod.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • efaustus9

    efaustus9

    16 HAZİRAN 2006
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009
  • Valdorsha

    Valdorsha

    8 Mayıs 2006