2013-11-30 2 views
0

Мой коллега продемонстрировал некоторый код для меня который я нашел довольно интересный:Динамически менять класс экземпляра во время выполнения?

class A(object): 
    def evolve(self): 
     if self.foo > 10: 
      self.__class__ = B 

class B(A): 
    def bar(self): 
     print "I'm a B" 

... это по существу суть его. Идея состоит в том, чтобы «специализировать» экземпляр во время выполнения после обработки других вычислений. Я думал об этом, и даже когда он чувствует себя не так (особенно назначение __class__), я не вижу в этом ничего плохого, если иерархия типов правильно учитывается.

Может ли быть способ сделать это в Python без назначения __class__?

Опять же, я не вижу в этом слишком много ошибок, поскольку назначение __class__ эффективно изменяет только порядок разрешения ... нет?

ответ

2

Классический способ делать такие вещи - Strategy Pattern. Создается набор подобных классов, а затем первичный класс действует как фасад, а его методы делегируют операции содержащемуся классу/объекту.

+0

Я обсуждал это с моим коллегой. Проблема в том, что полный интерфейс не известен заранее. Проекты выступают в качестве абстракции для проприетарного интерфейса, который является огромным! Невозможно абстрагировать все это. Нам нужно всего лишь минутное подмножество. Я только передаю информацию. У меня не было возможности полностью проанализировать проблему ... – exhuma

1

То, что вы здесь описываете, является «технически возможной» реализацией как шаблонов штата, так и стратегий. Теперь, когда это законный код на языке python, я настоятельно рекомендую против него, если только в качестве последнего вредоносного программного обеспечения для объектов, которые инстанцируются в части кода, на который вы не контролируете, и даже тогда могут быть более эффективные способы.

Из личного опыта (и я много экспериментировал с наиболее динамичными функциями Python), придерживающегося более условных реализаций шаблонов State и Strategy, обеспечивает более читаемый, проверяемый и поддерживаемый код.

Смежные вопросы