SORU
25 Mart 2009, ÇARŞAMBA


Python çoklu kurucular için temiz, pythonic bir yolu nedir?

Bunun için kesin bir cevap bulamıyorum. AFAIK, bir Python sınıfı __init__ birden fazla işlevi olabilir. Bu sorunu çözmek için iyi bir yol nedir?

number_of_holes özelliği ile bir sınıf Cheese aradım sanırım. Nasıl peynir-nesneleri oluşturmak için iki yol var

  • böyle bir mağazada bir sayı alır: parmesan = Cheese(num_holes = 15)
  • ve herhangi bir argüman alır ve sadece number_of_holes özelliği rasgele bir: gouda = Cheese()

Bunu yapmak için tek bir yol düşünemiyorum, ama bu biraz hantal görünüyor:

class Cheese():
    def __init__(self, num_holes = 0):
        if (num_holes == 0):
            # randomize number_of_holes
        else:
            number_of_holes = num_holes

Sen ne diyorsun? Daha iyi bir yolu var mı?

CEVAP
25 Mart 2009, ÇARŞAMBA


Aslında None için daha hayırlıdır "" değerler: . magic

class Cheese():
    def __init__(self, num_holes = None):
        if(num_holes is None):
            ...

Eğer daha fazla parametre ekleyerek tam özgürlük istiyorsan:

class Cheese():
    def __init__(self, *args, **kwargs):
        #args -- tuple of anonymous arguments
        #kwargs -- dictionary of named arguments
        self.num_holes = kwargs.get('num_holes',random_holes())

Daha iyi *args **kwargs kavramı (aslında bu isimleri değiştirebilirsiniz) açıklamak için:

def f(*args, **kwargs):
   print 'args: ', args, ' kwargs: ', kwargs

>>> f('a')
args:  ('a',)  kwargs:  {}
>>> f(ar='a')
args:  ()  kwargs:  {'ar': 'a'}
>>> f(1,2,param=3)
args:  (1, 2)  kwargs:  {'param': 3}

http://docs.python.org/reference/expressions.html#calls

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Official Android Tips

    Official And

    23 EYLÜL 2009
  • Michelle Phan

    Michelle Pha

    18 Temmuz 2006
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011