SORU
19 Ocak 2009, PAZARTESİ


Python sınıf fabrika

Python yeniyim ve bu senaryo altında uygulanması yardıma ihtiyacım var.

İki farklı kayıt etki alanı yönetmek için iki sınıf var. Her ikisi de aynı arayüzü, örn

class RegistrarA(Object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...

ve

class RegistrarB(object):
    def __init__(self, domain):
        self.domain = domain

    def lookup(self):
        ...

    def register(self, info):
        ...

Bir etki alanı adı verilen, doğru kayıt sınıfı uzantısına göre, örneğin yükleyen bir Etki alanı sınıf oluşturmak istiyorum

com = Domain('test.com') #load RegistrarA
com.lookup()

biz = Domain('test.biz') #load RegistrarB
biz.lookup()

Bu başarılı bir fabrika işlevi (aşağıya bakınız) kullanılarak yapılabilir biliyorum, ama bunu yapmanın en iyi yolu mu yoksa daha iyi bir şekilde OOP özellikleri kullanıyor?

def factory(domain):
  if ...:
    return RegistrarA(domain)
  else:
    return RegistrarB(domain)

CEVAP
19 Ocak 2009, PAZARTESİ


Bir işlevi kullanmak iyidir bence.

Daha ilginç olan soru ise nasıl yüklemek için hangi belirliyorsunuz? Bir seçenek uygulamaları alt __subclasses__() arama is_registrar_for() sınıfı bir yöntem üzerinde yineleme sonra: soyut temel İşleri bir sınıf sahip olmaktır

class Registrar(object):
  def __init__(self, domain):
    self.domain = domain

class RegistrarA(Registrar):
  @classmethod
  def is_registrar_for(cls, domain):
    return domain == 'foo.com'

class RegistrarB(Registrar):
  @classmethod
  def is_registrar_for(cls, domain):
    return domain == 'bar.com'


def Domain(domain):
  for cls in Registrar.__subclasses__():
    if cls.is_registrar_for(domain):
      return cls(domain)
  raise ValueError


print Domain('foo.com')
print Domain('bar.com')

Bu Registrars yeni şeffaf ekleyelim ve onlara her destekleyen kararı, temsilci.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • Charles Griffin Gibson

    Charles Grif

    26 NİSAN 2006
  • Lamborghini

    Lamborghini

    13 Aralık 2005