Если я запускаю следующий код: cartopy
Казалось бы неизменен ДИКТ в экземпляре объекта
import cartopy.crs as ccrs
globe = ccrs.LambertCylindrical()
print(globe.proj4_params)
globe.proj4_params['a'] = 5
print(globe.proj4_params)
я получаю:
{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}
{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}
Impying что proj4_params
свойства неизменно.
Но это просто болото стандарт dict
:
print(type(globe.proj4_params))
<class 'dict'>
Который, так как она реализована в C, не могут быть перезаписаны, чтобы иметь такого рода поведение (по крайней мере, не безопасно).
Хорошо, но код этого класса dead simple, так что с моим пониманием что-то не так. Может кто-нибудь объяснить мне, почему я получаю такое поведение?
Edit:
Следующие:
projection.proj4_params = dict(projection.proj4_params)
Результатов в:
*** AttributeError: attribute 'proj4_params' of 'cartopy._crs.CRS' objects is not writable
Я подозреваю, что 'globe.proj4_params' является свойством, которое дает вам новую копию dict каждый раз, когда вы обращаетесь к ней, чтобы это не мешало вам. – RemcoGerlich
Обратите внимание, что класс не является простым: LambertCylindrical не устанавливает свойство proj4_params, его init вызывает init в своем суперклассе (_RectangularProject), который вызывает init в своем суперклассе (Projection), который не имеет init, но он имеет метаклассы. На самом деле я понятия не имею, откуда происходит свойство proj4_params. – RemcoGerlich
Что произойдет, если вы выполните 'params = globe.proj4_params; params ['a'] = 5; печать (PARAMS) '? – RemcoGerlich