سؤال

هل هناك المدمج في وظيفة / المشغل I يمكن أن تستخدم لتفريغ القيم من القاموس وتعيين إلى متغيرات سبيل المثال؟

وهذا ما أنوي القيام به:

c = MyClass()
c.foo = 123
c.bar = 123

# c.foo == 123 and c.bar == 123


d = {'bar': 456}
c.update(d)

# c.foo == 123 and c.bar == 456

وشيء أقرب إلى update() القاموس الذي قيم حمولة من قاموس آخر ولكن لكائن عادي المثال / فئة؟

هل كانت مفيدة؟

المحلول

وهناك أيضا طريقة أخرى للقيام بذلك بواسطة حلقات عبر العناصر في د. هذا لا يكون لها نفس assuption أنها سوف تحصل المخزنة في c.__dict__ وهذا غير صحيح دائما.

d = {'bar': 456}
for key,value in d.items():
    setattr(c,key,value)

وأو هل يمكن أن يكتب طريقة update كجزء من MyClass ذلك الأعمال التي c.update(d) مثلك المتوقع أن.

def update(self,newdata):
    for key,value in newdata.items():
        setattr(self,key,value)

وتحقق من مساعدة لsetattr

<اقتباس فقرة>
setattr(...)
    setattr(object, name, value)
    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to
    ''x.y = v''.

نصائح أخرى

هل حاولت

f.__dict__.update( b )

وأيضا، وربما سيكون من الطراز الجيد ان يكون هناك التفاف حول طريقة التحديث ديكت و:

def update(self, b):
    self.__dict__.update(b)

وPS: آسف لعدم تعليقه على @ S.Lott الصورة المنصب ولكن أنا لم يكن لديك مندوب حتى الان.

ويمكنك محاولة القيام:

def to_object(my_object, my_dict):
    for key, value in my_dict.items():
        attr = getattr(my_object, key)
        if hasattr(attr, '__dict__'):
            to_object(attr, value)
        else:
            setattr(my_object, key, value)

obj = MyObject()
data = {'a': 1, 'b': 2}
to_object(obj, data)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top