子类构造函数返回一个超类对象

时间:2012-12-03 03:22:10

标签: python django

我专注于django.contrib.gis.geos.Point只是为了更好地创建和处理明确纬度和经度的点。

我目前的代码:

from django.contrib.gis.geos import Point

class LLPoint(Point):
    def __init__(self, *args, **kwargs):
        lat = kwargs.get('latitude')
        lng = kwargs.get('longitude')

        if lat and lng:
            super(LLPoint, self).__init__(lng, lat)
        elif lat or lng:
            raise TypeError(u'You must both declare latitude and longitude, '
                'not just one of them.')
        else:
            super(LLPoint, self).__init__(*args, **kwargs)

    def __unicode__(self):
        c = self.coordinates()
        return u'LLPoint Lat: %.5f Lng: %.5f' % (c['latitude'], c['longitude']) 

    def coordinates(self):
        return {
            'latitude': self.coords[1], 
            'longitude': self.coords[0]
        }

问题是:

>>> LLPoint(latitude=10.0, longitude=20.0)
<Point object at 0xdeadbeef>

为什么它会返回Point个对象?这样我就不能使用我在子类中声明的任何东西。如果我尝试重现存根类的问题,它的工作原理。这可能是非常愚蠢的,但我看不到。

1 个答案:

答案 0 :(得分:6)

Point.__init__来电

    super(Point, self).__init__(point, srid=srid)

调用GEOSGeometry.__init__,调用

    self._post_init(srid)

执行

    self.__class__ = GEOS_CLASSES[self.geom_typeid]

self的类更改为Point。恶


你可以尝试:

class LLPoint(Point):
    def __init__(self, *args, **kwargs):
        ...
        super(LLPoint, self).__init__(lng, lat)   # this changes self.__class__ to Point
        ...
        self.__class__ = LLPoint