python - 是不是 "OK"才开始给Skyfield对象添加属性?

标签 python skyfield

此处,“OK”当然意味着 AYOR(风险由您自己承担),但如果避免与现有属性名称发生明显冲突,则不会出现可预见的问题。

Skyfield物体——尤其是行星——通常具有有限数量的属性。我经常编写简短的脚本来提取数字数据,并将其保存为文本并稍后使用。 这些本质上是“一次性”脚本,因为我很少使用它们超过一次或两次,并且从不共享它们。

当我编写更持久的代码时,我当然会创建自己的容器对象。

我的问题:它似乎对我来说效果很好,所以在这个特定上下文中,除了属性冲突之外,还有什么可能出错的地方吗?名字?

from skyfield.api import load
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

eph   = load('de421.bsp')
earth = eph['earth']
sun   = eph['sun']

ts = load.timescale()

t  = ts.utc(2016, 1, np.linspace(0, 366, 1000))

# SLOPPY WAY: just add them directly
earth.pos  = earth.at(t).position.km
sun.pos    = sun.at(t).position.km
earth.r    = np.sqrt(((earth.pos-sun.pos)**2).sum(axis=0))
earth.peri = earth.r.min()
earth.apo  = earth.r.max()

print earth.peri, earth.apo, earth.pos.shape


# BETTER WAY: tedious but more cautious
uhoh  = dict()
ep    = earth.at(t).position.km
sp    = sun.at(t).position.km
r     = np.sqrt(((ep-sp)**2).sum(axis=0))
uhoh['pos']  = ep
uhoh['r']    = r
uhoh['peri'] = r.min()
uhoh['apo']  = r.max()
earth.uhoh   = uhoh

print earth.uhoh['peri'], earth.uhoh['apo'], earth.uhoh['pos'].shape

返回:

147100175.99 152103762.948 (3, 1000)
147100175.99 152103762.948 (3, 1000)

最佳答案

这确实是一种在非正式 Python 代码中偶尔会遇到的模式。除了 future 的属性名称冲突之外,另一个可能出错的主要问题是库作者在想要更有效地创建数百万个对象的人们的怂恿下添加了 __slots__规范,并且当您尝试添加其他属性时开始收到错误。

防御__slots__如果出现的话,就是使用您想要使用的类的自己的子类。如果子类未能指定 __slots__也是——至少说__slots__ = []即使它没有更多想要添加的属性 - 那么子类的实例是完全开放的并且可以具有任何属性,因此您始终可以创建自己的子类来“解锁”实例并让它们具有任何属性。

请注意,像 earth 这样的对象有资格成为字典键,因此如果您有一条想要与每个行星关联的信息,您可以这样说:

positions = {}
positions[earth] = ...

当您需要记住一组对象中的每个对象的额外信息时,这是一种常见模式。

关于python - 是不是 "OK"才开始给Skyfield对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070803/

相关文章:

python - Skyfield:在给定的时间间隔内以 1 秒的周期获得 sgp4 结果

macos - 如何找到我的IDLE的Python,然后将pip升级应用到它使用的包?

python - 日心位置

python - Scrapy 从 div 中获取 href

Python 微软语音 API 错误 : SPERR_NO_DRIVER from CmdLoadFromFile

Python setuptools install_requires 错误

python-3.x - 天空场数据以获得给定日期范围内的远地点和近地点

python - sqlite 条件 SELECT 日期时间

python - 如何创建具有函数特殊(dunder)属性的 Mock

python - 我与 skyfield 的木星/土星合相计算与维基百科不匹配