Как настроить атрибуты в классах Python - PullRequest
2 голосов
/ 23 февраля 2012

Оо не мой самый сильный костюм, поэтому, пожалуйста, потерпите меня. Я хочу спроектировать структуру класса примерно так:

class Mammal(object):
    def __init__(self):
        super(Mammal, self).__init__()
        self.dna_sequence = self.sequence_dna()

    def sequence_dna(self):
        blood_sample = 42
        # Code goes here to sequence the mammal's DNA - may take a while.

Затем, в другом классе, я хочу унаследовать от Млекопитающего:

class Human(Mammal):
    super(Human, self).__init__()
    self.dna_sequence = self.sequence_dna()

    def sequence_dna(self):
        blood_sample = 43
        # use blood sample and Human algo to sequence it.

Так вот, где я застрял. Когда я создаю объект «Человек», я не хочу, чтобы он выполнял последовательность ДНК, потому что это занимает некоторое время. Но мне нужно, чтобы объект Human имел атрибут dna_sequence, чтобы я мог выполнить секвенирование позже. Является ли решение установить атрибут в методе init , но установить его на None, пока не будет вызван метод sequence_dna? Кажется глупым, тем более что у меня много переменных, все из которых будут зависеть от результата секвенирования ДНК и, следовательно, будут установлены на None.

Я чувствую, что мне не хватает части головоломки ...

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Один из способов справиться с этим - отложенная инициализация .Вы можете сделать что-то вроде ..

class Mammal(object):

    def __init__(self):
        self.blood_sample = 42
        self.dna_sequence = None

    def get_dna_sequence(self):
        if self.dna_sequence == None:
            self.generate_dna_sequence(self.blood_sample)
        return self.dna_sequence

    def generate_dna_sequence(self, blood_sample=None):
        self.dna_sequence = stuff_to_generate_sequence(blood_sample)

class Human(Mammal):
    def __init__(self):
          super(Mammal, self).__init__()
          self.blood_sample = 43

Затем человек автоматически наследует 'get_dna_sequence', но обе версии проходят процесс вычисления только по запросу.

Вы можете дополнительно улучшить метод get_dna_sequence (), сделав его генератором , если нет шансов, что выполняемые вами вычисления / сопоставления могут быть «разделены», вам следуетвыведите куски этого во время обработки, чтобы вам не приходилось хранить все это в памяти.(Что, для ДНК, я думаю, было бы довольно большим ..)

1 голос
/ 23 февраля 2012

Нет причины, по которой вы не можете инициализировать переменную None.

Вероятно, не хватает загадки, заключающейся в том, что переменная не должна быть основным интерфейсом для пользователей вашего классачтобы получить значение последовательности гена.Пусть они вызовут метод последовательности, а если метод последовательности дорог, просто используйте переменную-член в качестве кэша для результата.

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