2011-03-18 25 views
30

onun 'için argümanlar türetilmiş sınıfları yaratan bir fonksiyonu var: Ben yeni sınıflar oluşturmak için kullanabilirsiniz ŞimdiSınıf isimleri dinamik olarak nasıl ayarlanır?

def factory(BaseClass) : 
    class NewClass(BaseClass) : pass 
    return NewClass 

, sınıflar hepsi aynı adlı ve aynı tip gibi örnekleri bakmak gibidir:

NewA = factory(ClassA) 
NewB = factory(ClassB) 
print type(NewA()) # <class __main__.NewClass> 
print type(NewB()) # <class __main__.NewClass> 

elle __name__ özelliğini ayarlamak için uygun düzeltme var mı?

NewA.__name__ = 'NewA' 
print type(NewA()) # <class __main__.NewA> 

Bu sırada ayarlamam gereken başka şeyler var mı?

cevap

34

Evet, yapılacak doğru şey; Sınıf adını ayarlamak için başka bir şey ayarlamanıza gerek yoktur. Örneğin

:

def factory(BaseClass) : 
    class NewClass(BaseClass): pass 
    NewClass.__name__ = "factory_%s" % BaseClass.__name__ 
    return NewClass 

type burada kullanılacak yanlış şeydir. Sınıfları Python'un normal sınıf sözdizimi ile tanımlamanıza izin vermez, bunun yerine her sınıf özniteliğini el ile ayarlamanızı sağlar. Sınıfları elle oluşturmak için kullanılır, örn. Bir dizi temel sınıfınız varsa ve bunu kullanarak bir sınıf oluşturmak istiyorsanız (Python'un sınıf sözdizimi ile yapamayacağınız). Burada kullanma.

7

Üç argüman ile type() işlevini kullanarak kontrol edin. Aşağıdaki kod, taban türü olarak object ve başlangıç ​​nitelikleri olmaksızın yeni bir "NewA" sınıfı oluşturur. __name__ ayarı

>>> type('NewA', (object,), {}) 
<class '__main__.NewA'> 
+0

NewClass sınıf tanımı çok uzunsa biraz rahatsız edici görünüyor. Tüm yöntemleri bir sözlükte biriktirmek zorundayım (doc dizesinin oraya girdiğine inanıyorum '' __doc __ ''). – kiyo

+0

Ayrıca NewClass'taki yöntemler, temel olarak BaseClass yöntemlerine başvurmak zorunda kalırsa ne olur? – kiyo

+0

'type', değişken taban listeleriyle sınıf oluşturma gibi şeyler içindir; Bunun için tamamen yanlış bir araç. –

İlgili konular