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
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 Registrar
s yeni şeffaf ekleyelim ve onlara her destekleyen kararı, temsilci.
Python statik sınıf değişkenleri...
Python ile bir sınıf adını almak...
Python soyut sınıf ve arayüz arasındak...
Python sınıf devralır nesne...
Sınıf JSON seri hale getirilebilir nas...