2010-02-15 35 views

cevap

6

, sen locals() kullanabilirsiniz:

>>> class c(object): 
...  for i in range(10): 
...   locals()['A' + str(i)] = i 
... 
>>> c.A0 
0 
>>> c.A7 
7 
+0

Ben gördüğümü hatırlıyorum Ne olmasının sebebi. Teşekkür – Casebash

+0

Aslında, o setattr kullanarak daha güzel olduğunu düşünüyorum - ben) (bütün – Casebash

+6

de misin halk değiştirmek gerekiyordu değildir onun inelegant söyleyemem dict: http://docs.python.org/library/functions o inelegant neden .html # yerli – stephan

2

ben tam bilmiyorum.

attributes = ('x', 5), ('y', 6), ('name', 'Cls') 

class Cls: 
    pass 
for key, value in attributes: 
    setattr(Cls, key, value) 

bütün sınıf belirlendikten sonra çalıştırılmalıdır için unutmayın: Sana sınıf ekleyerek döngü için bir sınıfa niteliklerini örnek verebiliriz. Eğer önce sınıf erişmek istediğiniz çünkü (class ... bir sınıf nesnesi oluşturur python bir açıklamadır) oluşturduktan, o attr tanımlı değil, hatası alıyorum. Bir sınıf oluşturduktan ve hatırlamanızdan sonra özellik eklemeniz gerekir, bunlar sınıf öznitelikleri değil, örnek nitelikleri olacaktır. Çok şık olmasa da

1
class Attr: 
    def __init__(self): 
    for key in objects_type: 
     setattr(Attr, key, lambda cl: list()) 
+1

+1: İyi. Neden "nesneden" miras kalan "yeni stil" sınıfı olmasın? –

+2

Bunu yapmak için yanlış yer burası. Sadece bu savurganlık değil, varolan sınır yöntemleri de daha sonra ortaya çıkarılan nesnelerden gelen sınırlayıcı yöntemlerden farklı olacaktır. Eh, normalden daha farklı. –

2
newmeths = { 
    'two': lambda self: 2, 
} 

class MC(type): 
    def __init__(cls, name, bases, dict): 
    for k, v in newmeths.iteritems(): 
     setattr(cls, k, v) 
    super(MC, cls).__init__(name, bases, dict) 

class C(object): 
    __metaclass__ = MC 
    pass 

c=C() 
print c.two() 
3

dinamik sınıf eklemek istediğiniz varsayalım bu

classDict = {} 
for i in range(2): 
    classDict["func%s"%(i+1)] = lambda self:"X" 

Bunu yapmanın gibi niteliklerini birkaç şekilde Kolayca sınıf içinde

class Attr2(object): 
    pass 

for n,v in classDict.iteritems(): 
    setattr(Attr2, n, v) 

print Attr2().func1(), Attr2().func2() 

veya daha iyi sınıf adını erişmek can'y çünkü sınıf sadece örneğin anında sınıf oluşturmak oluşturulduktan sonra sadece özellikler eklemek

Attr3 = type("Attr3",(), classDict) 
print Attr3().func1(), Attr3().func2() 

veya Metaclass örn kullanmak istiyorsanız

class AttrMeta(type): 
    def __new__(cls, name, bases, dct): 
     dct.update(classDict) 
     return type.__new__(cls, name, bases, dct) 

class Attr4(object): 
    __metaclass__ = AttrMeta 

print Attr4().func1(), Attr4().func2() 
+1

Sanırım sorudan dolayı 'type' yöntemi en iyi çözümdür. Programcının sınıf özelliklerinin nasıl tanımlandığını yeniden yapılandırması gerekir. Öte yandan, bu ') (halk' içine kazma kaçınır özel metaclass tanımlayan kaçınır ve kullanımda herhangi _other_ metaclasses mantığıyla mucking kaçınır. IMO, bu başkalarının kullanacağı ve katkıda bulunacağı bir kütüphane için lezzetli hale getirir. – AlanSE

İlgili konular