?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share
Динамическое создание атрибутов - штатная фича Питона и малоизвестная фича C#
kelijah
Любой, кто начинает изучать Питон, быстро узнает такую фичу языка, как создание нового атрибута объекта в результате присваивания:

class Class1(object): pass
o = Class1()
o.attr1 = '1234'
print(o.attr1)


В строке 3 у объекта o добавляется новый атрибут, строка '1234'. Удобно, элегантно и позволяет выстрелить себе в ногу, если дрогнет рука.

Кстати, обойтись вместо пользовательского класса Class1 штатным object в этом сценарии не получится по той причине, что у экземпляров класса object нет атрибута __dict__, который и позволяет динамическое добавление атрибутов.

Для шарпистов (про плюсы вообще умолчим) вышеописанное может выглядеть немного пугающе. Но ирония в том, что в C# есть свой штатный, документированный и удобный способ добавления атрибутов (полей или даже методов) для объекта класса, причем без чернокнижной рефлексии. Правда, не любого класса, а ExpandoObject:

dynamic o = new System.Dynamic.ExpandoObject();
o.attr1 = "1234";
Console.Write("{0}", o.attr1);


В строке 3 происходит то же самое, что в питоновском коде - в экземпляр o добавляется новый член класса, строковое поле.