实例变量的重复装饰器
Repeating decorators for instance variables
我正在写一个class,我需要检查实例变量是否属于特定类型。
我注意到有很多重复代码。
有没有更好的方法对实例变量进行类似的检查?
或者这是正确的方法吗?
class Variable():
__type = 'Variable'
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
@property
def id(self):
return self.__id
@id.setter
def id(self, id=None):
if isinstance(id, int):
self.__id = id
else:
raise Exception('"id" must be an integer ')
@property
def updateable(self):
return self.__updateable
@updateable.setter
def updateable(self, updateable=None):
if isinstance(updateable, bool):
self.__updateable = updateable
else:
raise Exception('"updateatable" must be a bool')
@property
def name(self):
return self.__name
@name.setter
def name(self, name=None):
if isinstance(name, str):
self.__name = name
else:
raise Exception('"name" must be a string')
@property
def value(self):
return self.__value
@value.setter
def value(self, value=None):
if isinstance(value, np.ndarray):
self.__value = value
else:
raise Exception('"value" not an instance of np.ndarray')
Jones & Beazley 的书 Python Cookbook, 3rd Edition 包含食谱 9.21 Avoiding Repetitive 属性 Methods 几乎可以满足您的需求 — 我强烈建议您购买将这本书(或电子书)的副本发送给任何有兴趣成为熟练 Python 程序员的人,因为它包含许多这样的精华。 (免责声明:我与出版商或作者没有任何关系。)
几乎 Python 中的所有内容都是第一个 class 对象,因此可以创建一个简单定义 属性 和 returns 的函数。以这种方式做事会让你遵循 DRY Principle(并减少无聊的冗余代码)。
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
我正在写一个class,我需要检查实例变量是否属于特定类型。
我注意到有很多重复代码。 有没有更好的方法对实例变量进行类似的检查? 或者这是正确的方法吗?
class Variable():
__type = 'Variable'
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
@property
def id(self):
return self.__id
@id.setter
def id(self, id=None):
if isinstance(id, int):
self.__id = id
else:
raise Exception('"id" must be an integer ')
@property
def updateable(self):
return self.__updateable
@updateable.setter
def updateable(self, updateable=None):
if isinstance(updateable, bool):
self.__updateable = updateable
else:
raise Exception('"updateatable" must be a bool')
@property
def name(self):
return self.__name
@name.setter
def name(self, name=None):
if isinstance(name, str):
self.__name = name
else:
raise Exception('"name" must be a string')
@property
def value(self):
return self.__value
@value.setter
def value(self, value=None):
if isinstance(value, np.ndarray):
self.__value = value
else:
raise Exception('"value" not an instance of np.ndarray')
Jones & Beazley 的书 Python Cookbook, 3rd Edition 包含食谱 9.21 Avoiding Repetitive 属性 Methods 几乎可以满足您的需求 — 我强烈建议您购买将这本书(或电子书)的副本发送给任何有兴趣成为熟练 Python 程序员的人,因为它包含许多这样的精华。 (免责声明:我与出版商或作者没有任何关系。)
几乎 Python 中的所有内容都是第一个 class 对象,因此可以创建一个简单定义 属性 和 returns 的函数。以这种方式做事会让你遵循 DRY Principle(并减少无聊的冗余代码)。
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