У меня есть класс, в котором метод сначала должен убедиться, что атрибут присутствует, и иначе вызвать функцию для его вычисления. Затем, гарантируя, что атрибут не None
, он выполняет некоторые операции с ним. Я вижу два немного различных вариантов дизайна:Python design - инициализация, настройка и получение атрибутов класса
class myclass():
def __init__(self):
self.attr = None
def compute_attribute(self):
self.attr = 1
def print_attribute(self):
if self.attr is None:
self.compute_attribute()
print self.attr
И
class myclass2():
def __init__(self):
pass
def compute_attribute(self):
self.attr = 1
return self.attr
def print_attribute(self):
try:
attr = self.attr
except AttributeError:
attr = self.compute_attribute()
if attr is not None:
print attr
В первой конструкции, мне нужно, чтобы убедиться, что все атрибуты класса устанавливаются None
заранее, что может стать многословным но и уточнить структуру объекта.
Второй выбор, по-видимому, является более широко используемым. Однако для моих целей (научных вычислений, связанных с теорией информации) с использованием блоков try except
везде может быть немного избыточным, учитывая, что этот класс не взаимодействует с другими классами, он просто берет данные и вычисляет кучу вещей.
Я думаю, что вы хотите что-то вроде этого: http://stackoverflow.com/questions/3012421/python-memoising- отложенный-поиск-свойство-декоратор.Получение класса для печати само по себе не очень pythonic; вместо этого реализуем '__repr__' и/или' __str__'. – jonrsharpe
Поскольку каждый объект класса обязательно должен иметь атрибут 'attr', лучше использовать дизайн первого класса. Это разъясняет, каковы атрибуты этого класса. вы также можете установить атрибут attr как атрибут класса, каждый раз, когда вы будете получать доступ с помощью self.attr, он будет проглатывать копию attr, и вы можете установить/получить только для перкулярного объекта. – Roshan