В JavaScript я переписываю каждую функцию так, чтобы она могла завершиться как можно скорее. Вы хотите, чтобы браузер вернулся в управление, чтобы он мог внести изменения в DOM.
Каждый раз, когда мне хотелось поспать в середине моей функции, я реорганизовал использовать setTimeout()
.
Я собираюсь отредактировать этот ответ, потому что нашел это полезным:
blockquote>Беспокойный сон, или задержка, функционирует на любом языке, много обсуждается. Некоторые скажут, что всегда должен быть сигнал или обратный вызов для запуска данной функции, другие будут утверждать, что иногда произвольный момент задержки полезен. Я говорю, что каждому свое и одно правило никогда не может диктовать что-либо в этой отрасли.
Написание функции сна просто и делает его еще более полезным с помощью 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! });
Попробуйте этот подход:
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")
Это похоже на другие решения, которые повторяют словарь по умолчанию, но использует более компактную нотацию:
class MyClass(object):
def __init__(self, **kwargs):
self.__dict__.update(dict(
arg1=123,
arg2=345,
arg3=678,
), **kwargs)
Мне никогда не приходилось иметь дело с этой ситуацией или этой темой. Ваше описание подразумевает, что вы, как вы разрабатываете дизайн, можете найти, что есть ряд дополнительных классов, которые станут релевантными - наиболее очевидным является отсек. Если они возникают как классы сами по себе, вероятно, некоторые из ваших параметров становятся параметрами этих дополнительных классов.
Возможно, вы можете использовать объект «dict» Python? http://docs.python.org/tutorial/datastructures.html#dictionaries
Вы можете создать класс для своих параметров.
Вместо передачи нескольких параметров вы передаете один класс.
Похоже, вы могли бы сократить количество аргументов, построив объекты, такие как Axon
, Soma
и DendriticTree
вне конструктора LayerV, и передав эти объекты.
Некоторые из параметры используются только при построении, например DendriticTree
, другие также используются в других местах, поэтому проблема не такая четкая, но я определенно попытаюсь использовать этот подход.
После просмотра вашего кода и реализации я понятия не имею, как какой-либо из этих параметров относится друг к другу (из-за моей нехватки знаний по предмету нейронауки), я хотел бы указать вам на очень хорошую книгу по объектно-ориентированному дизайну , Навыки построения в объектно-ориентированном дизайне Стивена Ф. Лотта являются отличным чтением, и я думаю, это помогло бы вам и всем остальным в разработке объектно-ориентированных программ.
Он выпущен под лицензией Creative Commons, поэтому бесплатно для вас, здесь ссылка на него в формате PDF http://homepage.mac.com/s_lott/books/oodesign/build-python/latex/BuildingSkillsinOODesign.pdf
Я думаю, что ваша проблема сводится к общему дизайну ваших классов. Иногда, хотя и очень редко, для инициализации требуется множество аргументов, и в большинстве ответов здесь подробно описаны другие способы инициализации, но во многих случаях вы можете разбить класс на более легкие для обработки и менее громоздкие классы .
можете ли вы привести примерный код того, над чем работаете? Это поможет получить представление о том, что вы делаете, и получить помощь для вас раньше.
Если это просто аргументы, которые вы передаете классу, которые делают его длинным, вам не нужно его ставить все в __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])
Я бы сказал, что с этим подходом нет ничего плохого - если вам нужно 15 параметров для моделирования чего-то, вам нужно 15 параметров. И если нет подходящего значения по умолчанию, вы должны передать все 15 параметров при создании объекта. В противном случае вы можете просто установить значение по умолчанию и изменить его позже через сеттер или напрямую.
Другой подход заключается в создании подклассов для некоторых распространенных типов нейронов (в вашем примере) и обеспечения хороших значений по умолчанию для определенных значений, или вывести значения из других параметров.
Или вы можете инкапсулировать части нейрона в отдельные классы и повторно использовать эти части для реальных моделей, которые вы моделируете. I.e., вы могли бы написать отдельные классы для моделирования синапса, аксона, сомы и т. Д.
Можете ли вы дать более подробный пример использования? Возможно, шаблон прототипа будет работать:
Если в группах объектов есть сходство, может помочь шаблон прототипа. У вас есть много случаев, когда одно население нейронов подобно другому, кроме как-то иначе? (т. е. вместо того, чтобы иметь небольшое количество дискретных классов, у вас есть большое количество классов, которые немного отличаются друг от друга.)
Python - это классический язык, но так же, как вы можете имитировать программирование на основе классов в языке, основанном на прототипе, таком как Javascript, вы можете моделировать прототипы, предоставляя вашему классу метод CLONE, который создает новый объект и заполняет его ivars из родителя. Напишите метод clone, чтобы переданные ему параметры ключа переопределили «унаследованные» параметры, поэтому вы можете вызвать его с помощью чего-то типа:
new_neuron = old_neuron.clone( branching_length=n1, branching_randomness=r2 )
Имея так много параметров, предположим, что класс, вероятно, делает слишком много вещей.
Я предлагаю вам разделить свой класс на несколько классов, каждый из которых принимает некоторые из ваших параметров. Таким образом, каждый класс проще и не будет принимать столько параметров.
Не зная больше о вашем коде, я не могу точно сказать, как вы должны разделить его.