Python 属性 工厂或描述符 class 用于包装外部库
Python property factory or descriptor class for wrapping an external library
我正在为通过 Pythonnet 访问的 C# API 编写 Python 包装器 class。
因为我想用我自己的方法扩展 API,所以我决定使用 here:
概述的组合方法来包装它
C# API 大量使用我想在我的 Python 代码中模仿的属性。以下最小示例显示了我当前对 C# Surface class 示例的方法,该示例具有两个属性 width 和 height:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
@property
def width(self):
return self.api_surface.width
@width.setter
def width(self, value):
self.api_surface.width = value
@property
def height(self):
return self.api_surface.height
@height.setter
def height(self, value):
self.api_surface.height = value
我总共要处理大约 50 个属性。对于几组属性,我想添加自己的错误检查、类型转换等。
我正在寻找的是一种定义属性的 Pythonic 方式,例如通过工厂或使用描述符。感谢您的帮助!
编辑:我希望能够在 python shell 中使用制表符补全,即表面。 {hit tab} 应该提议 surface.width 和 surface.height。这似乎无法使用 Greg 概述的 getattr 方法。
如果您想避免所有手动编码,您可以只使用 getattr 和 setattr。这个答案适用于 python2 顺便说一句。
class MySurface(object):
def __init__(self):
self.props = {"width": 0, "length": 0, ...}
def __setattr__(self, attr, val):
if attr in self.props:
self.props[attr] = val
else:
super(MySurface, self).__setattr__(attr, val)
def __getattr__(self, attr):
if attr in self.props:
return self.props[attr]
else:
return self.__getattribute__(attr)
我能够使用以下 属性 工厂解决问题:
def surface_property(api_property_name, docstring=None):
def getter(self):
return self.api_surface.__getattribute__(api_property_name)
def setter(self, value):
self.api_surface.__setattr__(api_property_name, value)
return property(getter, setter, doc=docstring)
使用此函数,class 定义减少为:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
width = surface_property('Width','Get and set the width.')
height = surface_property('height', 'Get and set the height.')
我正在为通过 Pythonnet 访问的 C# API 编写 Python 包装器 class。 因为我想用我自己的方法扩展 API,所以我决定使用 here:
概述的组合方法来包装它C# API 大量使用我想在我的 Python 代码中模仿的属性。以下最小示例显示了我当前对 C# Surface class 示例的方法,该示例具有两个属性 width 和 height:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
@property
def width(self):
return self.api_surface.width
@width.setter
def width(self, value):
self.api_surface.width = value
@property
def height(self):
return self.api_surface.height
@height.setter
def height(self, value):
self.api_surface.height = value
我总共要处理大约 50 个属性。对于几组属性,我想添加自己的错误检查、类型转换等。 我正在寻找的是一种定义属性的 Pythonic 方式,例如通过工厂或使用描述符。感谢您的帮助!
编辑:我希望能够在 python shell 中使用制表符补全,即表面。 {hit tab} 应该提议 surface.width 和 surface.height。这似乎无法使用 Greg 概述的 getattr 方法。
如果您想避免所有手动编码,您可以只使用 getattr 和 setattr。这个答案适用于 python2 顺便说一句。
class MySurface(object):
def __init__(self):
self.props = {"width": 0, "length": 0, ...}
def __setattr__(self, attr, val):
if attr in self.props:
self.props[attr] = val
else:
super(MySurface, self).__setattr__(attr, val)
def __getattr__(self, attr):
if attr in self.props:
return self.props[attr]
else:
return self.__getattribute__(attr)
我能够使用以下 属性 工厂解决问题:
def surface_property(api_property_name, docstring=None):
def getter(self):
return self.api_surface.__getattribute__(api_property_name)
def setter(self, value):
self.api_surface.__setattr__(api_property_name, value)
return property(getter, setter, doc=docstring)
使用此函数,class 定义减少为:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
width = surface_property('Width','Get and set the width.')
height = surface_property('height', 'Get and set the height.')