Вызовите произвольный дочерний атрибут из родительского класса? - PullRequest
0 голосов
/ 02 мая 2011

Я хочу пометить атрибуты производного класса (которые в остальном идентичны), чтобы метод родительского класса мог использовать определенный.

В этом примере я строю модели нейроновкаждый нейрон состоит из «областей», которые в свою очередь состоят из «сегментов».Существует родительский класс neuron_region.Родительский класс neuron_region имеет метод «connect», который соединяет сегмент с другим сегментом (передается ему в качестве аргумента - на другом нейроне).Должен быть способ пометить, к какому сегменту в производном классе необходимо подключиться.Что такое элегантный способ сделать это?

class neuron_region(object):
    def connect(external_segment)
       #connect segment 1 or segment 2 to external_segment, 
       #depending on which one is the right attribute

class child1(parent):
    #mark segment 1 as the segment to which to connect#
    self.seg1='segment 1'
    self.seg2='segment 2'

class child2(parent):
    self.seg1='segment 1'
    #mark segment 2 as the segment to which to connect#
    self.seg2='segment 2'

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Делай самое простое, что могло бы сработать - возможно, что-то вроде:

SEGMENTS = (SEGMENT_1, SEGMENT_2) = range(2)

class NeuronRegion(object):
    def __init__(self):
        self.connection = [None, None]
        self.chosen = 0
    def choose(self, segment):
        assert segment in SEGMENTS
        self.chosen = segment
    def connect(other_neuron_region):
       # remember to reset those to None when they're not needed anymore, 
       # to avoid cycles that prevent the garbage collector from doing his job:
       self.connection[self.chosen] = other_neuron_region
       other_neuron_region.connection[other_neuron_region.chosen] = self

class Child1(NeuronRegion):
   ''' other stuff '''

class Child2(NeuronRegion):
   ''' other stuff '''

[РЕДАКТИРОВАТЬ] Я должен признать, что мне это не очень нравится, но он делает то, что вы просили, ИМО.

0 голосов
/ 23 апреля 2013

Вы могли бы сделать

class neuron_region(object):
    def connect(external_segment)
       #connect segment 1 or segment 2 to external_segment, 
       #depending on which one is the right attribute
    # the following can/must be omitted if we don't use the conn_attr approach
    @property
    def connected(self):
        return getattr(self, self.conn_attr)

class child1(parent):
    seg1 = 'segment 1'
    seg2 = 'segment 2'
    #mark segment 1 as the segment to which to connect#
    conn_attr = 'seg1'
    # or directly - won't work if seg1 is changed sometimes...
    connected = seg1


class child2(parent):
    seg1 = 'segment 1'
    seg2 = 'segment 2'
    #mark segment 2 as the segment to which to connect#
    conn_attr = 'seg2'
    # or directly - won't work if seg2 is changed sometimes...
    connected = seg2

Здесь у вас есть даже 2 подхода:

  1. Дочерний класс определяет атрибут conn_attr, чтобы определить, какой атрибут использовать для подключения. Он используется в свойстве connected в базовом классе. Если seg1 соотв. seg2 время от времени меняется, это путь.

  2. Дочерний класс напрямую определяет connected. Таким образом, нет необходимости в перенаправляющем свойстве, но это работает, только если не изменяется ни один из используемых атрибутов.

В обоих подходах родительский класс просто использует self.connected.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...