2010-03-11 36 views
16

Diyelim ki bir sınıfın bir örneğini oluşturuyorum ve genel özelliklerine bazı değerler atamak istiyorum. Genellikle bu böyle bitmiş olacaktır:Python'da sınıf özelliklerine dinamik olarak nasıl erişilir?

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

Ama bir parametre olarak bir sınıf alan bir işlevi yazıp ben dinamik olarak bu sınıfın ortak özellikleri için bazı değerleri atamak isterseniz neyi - yani yoluyladır

myclass = MyClass() 
myclass['name'] = "My name" 

Ama bu işe yaramazsa: (. onlar denir kaç vardır ya bilmeden) değişkenler ve döngüler

bariz olacaktır.

Herhangi bir fikrin var mı? işini

class MyClass: 
    def __init__(self): 
    self.name = None 
    self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop)) 

print 

for prop in dir(myclass): 
    if prop[:2]!='__' and prop[-2:]!='__': 
     print prop[-2:] 
     setattr(myclass,prop,"Foo Bar") 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop))  

yapmak Fakat bu kod aynı zamanda '__doc__', '__init__', '__module__' özelliklerini "Foo Bar" için ayarlar nedeniyle dikkatli olmalıdır setattr ile dir kullanma

+0

Ayrıca, bu bir kopyasıdır: http://stackoverflow.com/questions/1167398/python-access-class-property-from-string –

cevap

31
setattr(my_class_instance, 'attr_name', attr_value) 
+4

Belgeler burada bulunabilir: http://docs.python.org/ library/functions.html –

0

. Bu nedenle, dir tarafından verilen belirli şeylerden kaçınmaya dikkat etmeniz gerekecektir (özellikle __ çift alt çizgi ile başlayan ve bitenler).

myclass = MyClass() 
myclass.name = "foo" 
myclass.text = "bar" 

: hala doğrudan özelliklerini ayarlamak mümkün olan ederken

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 
    def __getitem__(self, name): 
     return getattr(self, name) 
    def __setitem__(self, name, value): 
     return setattr(self, name, value) 
    def __delitem__(self, name): 
     return delattr(self, name) 
    def __contains__(self, name): 
     return hasattr(self, name) 

:

4

okuma ben sözlük tarzı bir nesnenin özelliklerine erişim sağlayan bir mixin sınıfını kullanıyorum Syntax For Dynamic Attribute Access reddedilen sonra Daha sonra bunları dinamik olarak ayarlamak mümkündür:

for attr in ('name', 'text'): 
    myclass[attr] = confirm(attr, default=myclass[attr]) 
+0

Kabul edilen cevap olmalı – TyrionGraphiste

İlgili konular