Bir özelliği programlı olarak nasıl ayarlarsınız?


208

Bir piton nesneniz xve bir dize sben özniteliği ayarlanmış, nasıl süzerine x? Yani:

>>> x = SomeObject()
>>> attr = 'myAttr'
>>> # magic goes here
>>> x.myAttr
'magic'

Sihir nedir? Bunun amacı tesadüfen çağrıları önbelleğe almaktır x.__getattr__().

Yanıtlar:


293
setattr(x, attr, 'magic')

Yardım için:

>>> help(setattr)
Help on built-in function setattr in module __builtin__:

setattr(...)
    setattr(object, name, value)

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ``x.y = v''.

Düzenleme: Ancak, (bir açıklamada işaret edildiği gibi) bir "saf" örneği için bunu yapamam unutmayın object. Ama muhtemelen iyi çalışacağı basit bir nesne alt sınıfına sahipsiniz. OP'yi asla böyle bir nesne örneği yapmaya zorlamam.


12
Ancak dikkatli olun, bu, nesnenin () örneğini oluşturduğunuz senaryoda çalışmaz.
S.Lott

3
Kesinlikle doğru, değil. Bunu rahatlıkla görmezden geldim. OP'yi asla böyle bir nesne örneği yapmaya zorlamam.
Ali Afshar

2
Lanet olsun utanç, her durumda işe yaramaz, çünkü bu, örneğin dirtykullanıcı girişine öznitelik eklemek için gerçekten yararlı olacaktır ...
brice

1
@Brice: setattr neredeyse tüm durumlarda çalışır. Verimlilik ve diğer nedenlerle, 'nesne' programlanır, böylece ona ekstra özellikler ekleyemezsiniz. Bunu kendi __slots__özelliğiniz ile kendi sınıfınızla yapabilirsiniz .
dirkjot

4
Bu da işe yaramıyor int. Nedenini açıklayabilir misin? (hepsi bitti __builtin__mi?
Jens Timmerman

54

Genellikle, bunun için sınıfları tanımlarız.

class XClass( object ):
   def __init__( self ):
       self.myAttr= None

x= XClass()
x.myAttr= 'magic'
x.myAttr

Bununla birlikte, bunu bir ölçüde setattrve getattryerleşik işlevlerle yapabilirsiniz. Ancak, objectdoğrudan örnekler üzerinde çalışmazlar .

>>> a= object()
>>> setattr( a, 'hi', 'mom' )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hi'

Bununla birlikte, her türlü basit sınıf üzerinde çalışırlar.

class YClass( object ):
    pass

y= YClass()
setattr( y, 'myAttr', 'magic' )
y.myAttr

25
Bunun neden object () örnekleri ile çalışmadığına dair herhangi bir fikir var mı?
meawoppl

@meawoppl Bunu yeni bir soru
Tobias Kienzler

Burada sordum .
jalanb

1
Sınıflar yerine Modüller ile bunu yapabilir miyim?
bonobo

21

x bir nesne olsun, o zaman iki şekilde yapabilirsiniz

x.attr_name = s 
setattr(x, 'attr_name', s)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.