IronPython переопределяет __setattr__ и __getattr__ - PullRequest
3 голосов
/ 02 апреля 2010

Я пытаюсь реализовать класс в C # с помощью метода, который перехватывает магические методы Python __setattr__ и __getattr__. Я нашел этот отчет об ошибке:

http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=8143

Но это с 2008 года, и нигде я не могу найти ICustomAttributes или PythonNameAttribute. Я не вижу ничего полезного в Interfaces.cs. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

4 голосов
/ 02 апреля 2010

Я не использую IronPython, поэтому могу ошибаться, но вот что я бы предположил.

Учитывая, что Dynamic Language Runtime теперь полностью интегрирован в .NET 4.0, а IronPython основан на DLR, вы должны иметь возможность использовать стандартный способ .NET для создания объектов, которые обрабатывают установку / получение несуществующих членов / атрибутов / свойства. Это можно сделать с помощью интерфейса IDynamicMetaObjectProvider. Более простым способом является наследование от DynamicObject, которое обеспечивает реализацию по умолчанию для большинства методов и добавление только того метода, который вам нужен (см. члены DynamicObject ):

class MyObject : DynamicObject {
  public override bool TryGetMember
      (GetMemberBinder binder, out object result) {
    string name = binder.Name;
    // set the 'result' parameter to the result of the call
    return // true to pretend that attribute called 'name' exists
  }

  public override bool TrySetMember
      (SetMemberBinder binder, object value) {
    // similar to 'TryGetMember'
  }  
}

В C # вы можете использовать этот объект благодаря dynamic. IronPython должен относиться к нему так же!

...