【发布时间】:2020-06-05 01:01:24
【问题描述】:
我创建了一个BetterMarker 类,它继承自folium.Marker,这是一个地理点对象,可以添加到生成Leaflet HTML 地图的folium.Map 对象。
import folium, datetime
class BetterMarker(folium.Marker):
def __init__(self, latitude, longitude, **kwargs):
super().__init__([latitude, longitude], **kwargs)
self.latitude = latitude
def north_or_south(self):
if self.latitude > 0:
return "North"
else:
return "South"
我现在可以初始化BetterMarker 并将其实例添加到folium.Map 对象:
mymap = folium.Map() # Create Map object
bm = BetterMarker(30, 40, popup = "Hi there")
bm.add_to(mymap) # Add BetterMarker object to Map
mymap.save("mymap.html") # Save the map with the marker into HTML
上面的代码可以很好地生成以下地图:
但是,我不想在bm = BetterMarker(30, 40, popup = "Hi there") 中使用字符串Hi there,而是使用bm.north_or_south():
bm = BetterMarker(30, 40, popup = bm.north_or_south())
当然,以上行不通。下面的代码可以工作,但这意味着初始化类两次:
bm = BetterMarker(30, 40)
bm = BetterMarker(30, 40, popup = bm.north_or_south())
这样做的明智方法是什么?我做错了什么?
【问题讨论】:
-
最好在
__init__()函数中进行这些更改,而不是在对象初始化期间。if not popup: self.popup = ... -
@Felipe 不确定您要对
if not popup做什么。为什么我需要检查 popup 是否为 None? -
因为您没有在此处传递它
bm = BetterMarker(30, 40),但随后尝试通过在此处传递它bm = BetterMarker(30, 40, popup = bm.north_or_south())来重新初始化对象。所以相反,如果在BetterMaker内部有if not popup:,那么你可以跳过两次初始化类的过程,如果没有传递给构造函数,则始终将popup设置为函数调用north_or_south。跨度> -
@Felipe 即使我在
__init__中添加了if not popup,同样bm = BetterMarker(30, 40, popup = bm.north_or_south())将返回NameError: name 'bm' is not defined -
当然它会给你那个错误——想法是摆脱双重对象初始化。我在下面为您添加了一个示例。
标签: python inheritance methods folium