<p>下面是我如何将方法添加到从库导入的类中。如果我修改了库,那么在下一次库升级时将丢失这些更改。我不能创建一个新的派生类,因为我不能告诉库使用我修改过的实例。因此,我通过添加缺少的方法来修补现有类:</p>
<pre><code># Import the standard classes of the shapely library
import shapely.geometry
# Define a function that returns the points of the outer
# and the inner polygons of a Polygon
def _coords_ext_int_polygon(self):
exterior_coords = [self.exterior.coords[:]]
interior_coords = [interior.coords[:] for interior in self.interiors]
return exterior_coords, interior_coords
# Define a function that returns the points of the outer
# and the inner polygons of a MultiPolygon
def _coords_ext_int_multi_polygon(self):
if self.is_empty:
return [], []
exterior_coords = []
interior_coords = []
for part in self:
i, e = part.coords_ext_int()
exterior_coords += i
interior_coords += e
return exterior_coords, interior_coords
# Define a function that saves outer and inner points to a .pt file
def _export_to_pt_file(self, file_name=r'C:\WizardTemp\test.pt'):
'''create a .pt file in the format that pleases thinkdesign'''
e, i = self.coords_ext_int()
with open(file_name, 'w') as f:
for rings in (e, i):
for ring in rings:
for x, y in ring:
f.write('{} {} 0\n'.format(x, y))
# Add the functions to the definition of the classes
# by assigning the functions to new class members
shapely.geometry.Polygon.coords_ext_int = _coords_ext_int_polygon
shapely.geometry.Polygon.export_to_pt_file = _export_to_pt_file
shapely.geometry.MultiPolygon.coords_ext_int = _coords_ext_int_multi_polygon
shapely.geometry.MultiPolygon.export_to_pt_file = _export_to_pt_file
</code></pre>
<p>请注意,同一个函数定义可以分配给两个不同的类。在</p>
<p><strong>编辑</strong></p>
<p>在我的例子中,我没有向我的类添加方法,而是向我安装的开源库<a href="https://pypi.python.org/pypi/Shapely" rel="nofollow noreferrer">^{<cd1>}</a>添加方法。在</p>
<p>在您的帖子中,您使用<code>p.get_name = ...</code>向对象实例<code>p</code>添加一个成员。我首先定义一个函数<code>_xxx()</code>,然后用<code>class.xxx = _xxx</code>将其添加到类定义中。在</p>
<p>我不知道你的用例,但通常你会向实例中添加变量,向类定义中添加方法,这就是为什么我要向你展示如何将方法添加到类定义而不是实例中。在</p>
<p>Shapely管理几何对象并提供计算多边形面积的方法,以及相互添加或减去多边形的方法,以及许多其他非常酷的东西。在</p>
<p>我的问题是我需要一些shapely没有提供的现成方法。在</p>
<p>在我的示例中,我创建了自己的方法,该方法返回外部轮廓的点列表和内部轮廓的点列表。我创建了两个方法,一个用于<code>Polygon</code>类,另一个用于<code>MultiPolygon</code>类。在</p>
<p>我还需要一个方法将所有点导出为<code>.pt</code>文件格式。在本例中,我只创建了一个同时处理<code>Polygon</code>和<code>MultiPolygon</code>类的方法。在</p>
<p>此代码位于名为<code>shapely_monkeypatch.py</code>的模块中(请参见<a href="https://stackoverflow.com/questions/5626193/what-is-a-monkey-patch">monkey patch</a>)。当导入模块时,定义名称以<code>_</code>开头的函数,然后将它们分配给名称不带<code>_</code>的现有类。(Python中的惯例是使用<code>_</code>作为仅供内部使用的变量或函数的名称。)</p>