Что такое ярлык для добавления нескольких полей в класс? [Дубликат]

В JavaScript я переписываю каждую функцию так, чтобы она могла завершиться как можно скорее. Вы хотите, чтобы браузер вернулся в управление, чтобы он мог внести изменения в DOM.

Каждый раз, когда мне хотелось поспать в середине моей функции, я реорганизовал использовать setTimeout().

Я собираюсь отредактировать этот ответ, потому что нашел это полезным:

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

Написание функции сна просто и делает его еще более полезным с помощью JavaScript Promises:

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});
53
задан NorthCat 25 June 2015 в 09:43
поделиться

11 ответов

Попробуйте этот подход:

class Neuron(object):

    def __init__(self, **kwargs):
        prop_defaults = {
            "num_axon_segments": 0, 
            "apical_bifibrications": "fancy default",
            ...
        }

        for (prop, default) in prop_defaults.iteritems():
            setattr(self, prop, kwargs.get(prop, default))

Затем вы можете создать Neuron следующим образом:

n = Neuron(apical_bifibrications="special value")
53
ответ дан blubb 25 August 2018 в 04:50
поделиться

Это похоже на другие решения, которые повторяют словарь по умолчанию, но использует более компактную нотацию:

class MyClass(object):

    def __init__(self, **kwargs):
        self.__dict__.update(dict(
            arg1=123,
            arg2=345,
            arg3=678,
        ), **kwargs)
2
ответ дан Cerin 25 August 2018 в 04:50
поделиться

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

1
ответ дан Chris Walton 25 August 2018 в 04:50
поделиться

Возможно, вы можете использовать объект «dict» Python? http://docs.python.org/tutorial/datastructures.html#dictionaries

6
ответ дан Karl-Bjørnar Øie 25 August 2018 в 04:50
поделиться

Вы можете создать класс для своих параметров.

Вместо передачи нескольких параметров вы передаете один класс.

0
ответ дан Luc M 25 August 2018 в 04:50
поделиться

Похоже, вы могли бы сократить количество аргументов, построив объекты, такие как Axon, Soma и DendriticTree вне конструктора LayerV, и передав эти объекты.

Некоторые из параметры используются только при построении, например DendriticTree, другие также используются в других местах, поэтому проблема не такая четкая, но я определенно попытаюсь использовать этот подход.

3
ответ дан Marcello Romani 25 August 2018 в 04:50
поделиться

После просмотра вашего кода и реализации я понятия не имею, как какой-либо из этих параметров относится друг к другу (из-за моей нехватки знаний по предмету нейронауки), я хотел бы указать вам на очень хорошую книгу по объектно-ориентированному дизайну , Навыки построения в объектно-ориентированном дизайне Стивена Ф. Лотта являются отличным чтением, и я думаю, это помогло бы вам и всем остальным в разработке объектно-ориентированных программ.

Он выпущен под лицензией Creative Commons, поэтому бесплатно для вас, здесь ссылка на него в формате PDF http://homepage.mac.com/s_lott/books/oodesign/build-python/latex/BuildingSkillsinOODesign.pdf

Я думаю, что ваша проблема сводится к общему дизайну ваших классов. Иногда, хотя и очень редко, для инициализации требуется множество аргументов, и в большинстве ответов здесь подробно описаны другие способы инициализации, но во многих случаях вы можете разбить класс на более легкие для обработки и менее громоздкие классы .

1
ответ дан Nate 25 August 2018 в 04:50
поделиться

можете ли вы привести примерный код того, над чем работаете? Это поможет получить представление о том, что вы делаете, и получить помощь для вас раньше.

Если это просто аргументы, которые вы передаете классу, которые делают его длинным, вам не нужно его ставить все в __init__. Вы можете установить параметры после создания класса или передать словарь / класс, полный параметров, в качестве аргумента.

class MyClass(object):

    def __init__(self, **kwargs):
        arg1 = None
        arg2 = None
        arg3 = None

        for (key, value) in kwargs.iteritems():
            if hasattr(self, key):
                setattr(self, key, value)

if __name__ == "__main__":

    a_class = MyClass()
    a_class.arg1 = "A string"
    a_class.arg2 = 105
    a_class.arg3 = ["List", 100, 50.4]

    b_class = MyClass(arg1 = "Astring", arg2 = 105, arg3 = ["List", 100, 50.4])
3
ответ дан NorthCat 25 August 2018 в 04:50
поделиться

Я бы сказал, что с этим подходом нет ничего плохого - если вам нужно 15 параметров для моделирования чего-то, вам нужно 15 параметров. И если нет подходящего значения по умолчанию, вы должны передать все 15 параметров при создании объекта. В противном случае вы можете просто установить значение по умолчанию и изменить его позже через сеттер или напрямую.

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

Или вы можете инкапсулировать части нейрона в отдельные классы и повторно использовать эти части для реальных моделей, которые вы моделируете. I.e., вы могли бы написать отдельные классы для моделирования синапса, аксона, сомы и т. Д.

14
ответ дан onitake 25 August 2018 в 04:50
поделиться

Можете ли вы дать более подробный пример использования? Возможно, шаблон прототипа будет работать:

Если в группах объектов есть сходство, может помочь шаблон прототипа. У вас есть много случаев, когда одно население нейронов подобно другому, кроме как-то иначе? (т. е. вместо того, чтобы иметь небольшое количество дискретных классов, у вас есть большое количество классов, которые немного отличаются друг от друга.)

Python - это классический язык, но так же, как вы можете имитировать программирование на основе классов в языке, основанном на прототипе, таком как Javascript, вы можете моделировать прототипы, предоставляя вашему классу метод CLONE, который создает новый объект и заполняет его ivars из родителя. Напишите метод clone, чтобы переданные ему параметры ключа переопределили «унаследованные» параметры, поэтому вы можете вызвать его с помощью чего-то типа:

new_neuron = old_neuron.clone( branching_length=n1, branching_randomness=r2 )
1
ответ дан Steven D. Majewski 25 August 2018 в 04:50
поделиться

Имея так много параметров, предположим, что класс, вероятно, делает слишком много вещей.

Я предлагаю вам разделить свой класс на несколько классов, каждый из которых принимает некоторые из ваших параметров. Таким образом, каждый класс проще и не будет принимать столько параметров.

Не зная больше о вашем коде, я не могу точно сказать, как вы должны разделить его.

6
ответ дан Winston Ewert 25 August 2018 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: