Можете ли вы дать более подробный пример использования? Возможно, шаблон прототипа будет работать:
Если в группах объектов есть сходство, может помочь шаблон прототипа. У вас есть много случаев, когда одно население нейронов подобно другому, кроме как-то иначе? (т. е. вместо того, чтобы иметь небольшое количество дискретных классов, у вас есть большое количество классов, которые немного отличаются друг от друга.)
Python - это классический язык, но так же, как вы можете имитировать программирование на основе классов в языке, основанном на прототипе, таком как Javascript, вы можете моделировать прототипы, предоставляя вашему классу метод CLONE, который создает новый объект и заполняет его ivars из родителя. Напишите метод clone, чтобы переданные ему параметры ключа переопределили «унаследованные» параметры, поэтому вы можете вызвать его с помощью чего-то типа:
new_neuron = old_neuron.clone( branching_length=n1, branching_randomness=r2 )
Некоторое перекрытие в этих
Плотницкие работы Intermediate and Advanced Software в Коде Python
Как Pythonista: Идиоматический Python
Google Developers Day US - Шаблоны разработки Python
Другой ресурс примером в Рецепты Python . Большое количество не применяет лучшие методы, но можно найти некоторые шаблоны там, которые являются полезны
Тип
>>> import this
в консоли Python.
, Хотя это обычно рассматривают как (прекрасный!) шутка, это содержит несколько допустимых определенных для Python аксиом.
Bruce Eckel" Взгляды в Python " склоняется в большой степени на Шаблонах разработки
Для больше подробно смотрят на дизайн pattners, необходимо посмотреть Шаблоны разработки: Элементы Допускающего повторное использование Объектно-ориентированного программного обеспечения . Исходный код не находится в Python, но это не должно быть для Вас для понимания шаблонов.
Можно также хотеть считать этот статья (выберите файл pdf), который обсуждает Шаблоны разработки на ориентированных языках динамического объекта (т.е. Python). Заключить страницу в кавычки:
Данная статья исследует, как шаблоны от "Банды Четыре", или книга "GOF", как это часто называют, появляются, когда подобные проблемы решаются с помощью динамического, языка объектно-ориентированного программирования высшего порядка. Некоторые шаблоны исчезают - то есть, они поддерживаются непосредственно функциями языка, некоторые шаблоны более просты или имеют другой фокус, и некоторые чрезвычайно неизменны.
Чтобы упростить код при вызове атрибутов для объектов, которые могут существовать, а могут и не существовать, можно использовать шаблон проектирования Null Object Design Pattern (о котором я был представлен в Поваренная книга Python ).
Грубо говоря, цель с объектами Null - предоставить "интеллектуальную" замену часто используемому примитивному типу данных None в Python или Null (или указателям Null) в других языках.Они используются для многих целей, включая важный случай, когда один член некоторой группы других похожих элементов является особенным по какой-либо причине. Чаще всего это приводит к условным операторам, позволяющим различать обычные элементы и примитивное значение Null.
Этот объект просто съедает ошибку отсутствия атрибутов, и вы можете избежать проверки их существования.
Это не что иное, как
class Null(object):
def __init__(self, *args, **kwargs):
"Ignore parameters."
return None
def __call__(self, *args, **kwargs):
"Ignore method calls."
return self
def __getattr__(self, mname):
"Ignore attribute requests."
return self
def __setattr__(self, name, value):
"Ignore attribute setting."
return self
def __delattr__(self, name):
"Ignore deleting attributes."
return self
def __repr__(self):
"Return a string representation."
return "<Null>"
def __str__(self):
"Convert to a string and return it."
return "Null"
При этом, если вы сделаете Null («любой», «параметры», «вы», «хочу»). Attribute_that_doesnt_exists ()
он не взорвется, но просто незаметно становится эквивалентом прохода
.
Обычно вы делаете что-то вроде
if obj.attr:
obj.attr()
С этим вы просто делаете:
obj.attr()
и забываете об этом. Помните, что широкое использование объекта Null
потенциально может скрыть ошибки в вашем коде.