Python class 覆盖
Python class override
我正在尝试覆盖 Django OpenLayersWidget
中的媒体 class
这是我的代码:
class OpenLayersWidgetHttps(OpenLayersWidget):
class Media:
js = (
'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)
然而,当我尝试时:
w = OpenLayersWidgetHttps()
print(w.media)
我得到:
<script type="text/javascript" src="http://openlayers.org/api/2.13/OpenLayers.js"></script>
<script type="text/javascript" src="/static/gis/js/OLMapWidget.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js"></script>
不知何故,'http://openlayers.org/api/2.13/OpenLayers.js'
的默认媒体条目被保留。
为什么这不能正确覆盖 js
的值?
作为参考,这里是 Django 源代码中 OpenLayersWidget 的定义:
class OpenLayersWidget(BaseGeometryWidget):
template_name = 'gis/openlayers.html'
class Media:
js = (
'http://openlayers.org/api/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)
这是获取媒体的 _media(self) 的定义 属性:
def _media(self):
# Get the media property of the superclass, if it exists
sup_cls = super(cls, self)
try:
base = sup_cls.media
except AttributeError:
base = Media()
# Get the media definition for this class
definition = getattr(cls, 'Media', None)
if definition:
extend = getattr(definition, 'extend', True)
if extend:
if extend is True:
m = base
else:
m = Media()
for medium in extend:
m = m + base[medium]
return m + Media(definition)
else:
return Media(definition)
else:
return base
基本上,当您调用[您的class].media 时,superclasses 条目的列表会添加到结果列表中。换句话说,它正在做它应该做的事情。
Django documentation 说:
By default, any object using a static Media definition will inherit all the assets associated with the parent widget. This occurs regardless of how the parent defines its own requirements. For example, if we were to extend our basic Calendar widget from the example above:
您可以在 Media class 中设置 extend = False
以生成没有继承值的 media
变量。
class OpenLayersWidgetHttps(OpenLayersWidget):
class Media:
extend = False
js = (
'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)
我正在尝试覆盖 Django OpenLayersWidget
中的媒体 class这是我的代码:
class OpenLayersWidgetHttps(OpenLayersWidget):
class Media:
js = (
'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)
然而,当我尝试时:
w = OpenLayersWidgetHttps()
print(w.media)
我得到:
<script type="text/javascript" src="http://openlayers.org/api/2.13/OpenLayers.js"></script>
<script type="text/javascript" src="/static/gis/js/OLMapWidget.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js"></script>
不知何故,'http://openlayers.org/api/2.13/OpenLayers.js'
的默认媒体条目被保留。
为什么这不能正确覆盖 js
的值?
作为参考,这里是 Django 源代码中 OpenLayersWidget 的定义:
class OpenLayersWidget(BaseGeometryWidget):
template_name = 'gis/openlayers.html'
class Media:
js = (
'http://openlayers.org/api/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)
这是获取媒体的 _media(self) 的定义 属性:
def _media(self):
# Get the media property of the superclass, if it exists
sup_cls = super(cls, self)
try:
base = sup_cls.media
except AttributeError:
base = Media()
# Get the media definition for this class
definition = getattr(cls, 'Media', None)
if definition:
extend = getattr(definition, 'extend', True)
if extend:
if extend is True:
m = base
else:
m = Media()
for medium in extend:
m = m + base[medium]
return m + Media(definition)
else:
return Media(definition)
else:
return base
基本上,当您调用[您的class].media 时,superclasses 条目的列表会添加到结果列表中。换句话说,它正在做它应该做的事情。
Django documentation 说:
By default, any object using a static Media definition will inherit all the assets associated with the parent widget. This occurs regardless of how the parent defines its own requirements. For example, if we were to extend our basic Calendar widget from the example above:
您可以在 Media class 中设置 extend = False
以生成没有继承值的 media
变量。
class OpenLayersWidgetHttps(OpenLayersWidget):
class Media:
extend = False
js = (
'https://cdnjs.cloudflare.com/ajax/libs/openlayers/2.13.1/OpenLayers.js',
'gis/js/OLMapWidget.js',
)