Книга Python Кулинарная книга, 3-е издание от Jones & Beazley содержит рецепт 9.21 Как избежать повторяющихся методов свойств , который делает почти точно то, что вам нужно - я Настоятельно рекомендуем получить копию книги (или электронной книги) всем, кто заинтересован в том, чтобы стать опытным Python программистом, как можно быстрее, так как в нем много подобных драгоценных камней. (Отказ от ответственности: я не имею никакого отношения к издателю или авторам.)
Почти все в Python является первоклассным объектом, поэтому можно создать функцию, которая просто определяет свойство и возвращает его. Подобные действия позволят вам следовать принципу DRY (и писать менее скучный избыточный код).
def typed_property(name, expected_type):
storage_name = '__' + name
@property
def prop(self):
return getattr(self, storage_name)
@prop.setter
def prop(self, value):
if not isinstance(value, expected_type):
type_name = expected_type.__name__
raise TypeError('"{}" must be a {}'.format(name, type_name))
setattr(self, storage_name, value)
return prop
class Variable():
__type = 'Variable'
id = typed_property('id', int)
updateable = typed_property('updateable', bool)
name = typed_property('name', str)
value = typed_property('value', np.ndarray)
def __init__(self, id=None, updateable=True, name='Variable', value=None):
if id is not None:
self.id = id
if value is not None:
self.value = value
self.updateable = updateable
self.name = name