Python, переопределить функциональность унаследованного метода - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть следующий класс.

class PlotOnMap:

    def __init__(self, lat_lon_a, lat_lon_b, optimal, f_map=None):
        self.lat_lon_a = lat_lon_a
        self.lat_lon_b = lat_lon_b
        self.optimal = optimal
        self.f_map = f_map

    def create_map(self):
        """
        This function creates a map with folium, centered with the location of the three given points.
        """
        self.f_map = folium.Map([midlat, midlon], zoom_start=12)

    def plot_gdt_and_triangulation(self):
        """
        This function plots the locations given by the users with markers and create an heat map of the triangulation.
        """
        # plot the gdt's locations.
        folium.Marker(
            location=gdt1,
            popup='GDT 1',
            icon=folium.Icon()
        ).add_to(self.f_map)
        folium.Marker(
            location=gdt2,
            popup='GDT 2',
            icon=folium.Icon()
        ).add_to(self.f_map)
        folium.Marker(
            location=uav,
            popup='Target Area.',
            icon=folium.Icon()
        ).add_to(self.f_map)

        # plot the triangulation (regular and optimal) area
        plugins.HeatMap(data=self.lat_lon_a,
                        ).add_to(self.f_map)
        plugins.HeatMap(data=self.lat_lon_b,
                        ).add_to(self.f_map)
        plugins.HeatMap(data=self.optimal,
                        gradient={0.65: 'lime'}
                        ).add_to(self.f_map)

И я наследую его:

class Plot2ndPosition(PlotOnMap):

    def __init__(self, lat_lon_a, lat_lon_b, optimal):
        self.plot_on_map = super().__init__(lat_lon_a, lat_lon_b, optimal)

    def plot_map(self):
        return self.plot_on_map.create_map()

    def plot_locations(self):
        return self.plot_on_map.plot_gdt_and_triangulation()

единственное отличие состоит в том, что в классе Plot2ndPosition, во втором методе, Я не хочу строить gdt2 и тепловые карты, я хочу строить только gdt1 и и uav (первый и последний маркеры).

Я думал о чем-то в направлении назначения каждого переменной и как-то опустить его, когда я наследую метод.

    def plot_gdt_and_triangulation(self):
        """
        This function plots the locations given by the users with markers and create an heat map of the triangulation.
        """
        # plot the gdt's locations.
        one = folium.Marker(
            location=gdt1,
            popup='GDT 1',
            icon=folium.Icon()
        )

        one.add_to(self.f_map)
        two = folium.Marker(
            location=gdt2,
            popup='GDT 2',
            icon=folium.Icon()
        )
        two.add_to(self.f_map)

        three = folium.Marker(
            location=uav,
            popup='Target Area.',
            icon=folium.Icon()
        )
        three.add_to(self.f_map)

        # plot the triangulation (regular and optimal) area
        trian_plot1 = plugins.HeatMap(data=self.lat_lon_a,
                        ).add_to(self.f_map)
        trian_plot2 = plugins.HeatMap(data=self.lat_lon_b,
                        ).add_to(self.f_map)
        trian_plot3 = plugins.HeatMap(data=self.optimal,
                        gradient={0.65: 'lime'}
                        ).add_to(self.f_map)

1 Ответ

2 голосов
/ 03 февраля 2020

Один из вариантов - переопределить plot_gdt_and_triangulation() в Plot2ndPosition

class Plot2ndPosition(PlotOnMap):

    def __init__(self, lat_lon_a, lat_lon_b, optimal):
        super().__init__(lat_lon_a, lat_lon_b, optimal)

    def plot_gdt_and_triangulation(self):
        folium.Marker(
            location=gdt1,
            popup='GDT 1',
            icon=folium.Icon()
        ).add_to(self.f_map)
        folium.Marker(
            location=uav,
            popup='Target Area.',
            icon=folium.Icon()
        ).add_to(self.f_map)

Вы также можете удалить plot_map(), просто позвоните create_map(). Вы можете использовать Plot2ndPosition экземпляр, чтобы вызвать его. И если у вас есть больше логи c, вам не нужно сохранять базовый класс как член, все его методы уже доступны с self

def plot_map(self):
    return self.create_map()
...