LINUX.ORG.RU

[python]очередной глупый вопрос

 


0

0

предположим у меня есть 2 _разных_ класса с1 и с2, у них нет общего предка, они вообще ничем не связаны, но так получилось что у некоторых атрибутов из обоих классов совпадают имена. нужно атрибутам из первого класса, у которых имена совпадают с именами атрибутов из второго класса, дать значения атрибутов собственно второго класса. собственно навоял тут вот такой примерчик:

class c1:
    v1 = 1
    v2 = 1
    v3 = 1

class c2:
    v1 = 1
    v2 = 1
    v4 = 1


o1 = c1()
o1.v1 = 11
o1.v2 = 12
o1.v3 = 13

o2 = c2()
o2.v1 = 21
o2.v2 = 22
o2.v4 = 24

for k,v in o2.__dict__.items():
    if k in o1.__dict__:
        o1.__dict__[k]=o2.__dict__[k]

задачу оно свою выполняет, но выглядит ужасно. может можно покрасивее как?

Ответ на: комментарий от anonymous4

тогда в o1 появляются атрибуты от o2, которых там раньше не было, хотя это может и не критично. спасибо, в любом случае

z0D5e8n7x_2
() автор топика
Ответ на: комментарий от tailgunner

Странно от тебя такой глупый вопрос видеть :)

Если методы являются свойствами класса (не путать с методами класса), то они попадут в его __dict__, но не в __dict__ экземпляра.

anonymous4
()

Устанавливать атрибуты напрямую через __dict__ не есть хорошо. Не будет работать правильно если используются дескрипторы, лучше использовать setattr.

dccp
()
Ответ на: комментарий от dccp

Оно еще не будет работать, если (вдруг) используются слоты. Короче все это блэк мэджик, юзай наследование или прокси атрибутов.

anonymous4
()
Ответ на: комментарий от anonymous4

> Странно от тебя такой глупый вопрос видеть :)

Я стараюсь не использовать динамические фишки Питона, так что у меня в теплом кэше нет деталей :)

tailgunner ★★★★★
()
Ответ на: комментарий от z0D5e8n7x_2

Реализовать в классе c2 метод __getattr__, а там проверять имя свойства и возвращать значение соответствующего экземпляра c1.

anonymous4
()
Ответ на: комментарий от anonymous4

уууухх, круто. не подходит, но все равно спасибо))

z0D5e8n7x_2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.