对于这个问题的笨拙标题感到抱歉,但我想不出一个合适的表达方式。我正在使用Python 2.7中的日历类型应用程序。我有一个类Day
,它有一个
def __init__(self, d):
# Date in datetime.date format
self.date = d
# Julian date
self.julian = date_utils.calendar_util.gregorian_to_jd(d.year, d.month, d.day)
# Sun and moon rise and set times
self.sun = RiseSet()
self.moon = RiseSet()
...
def SetSunRise(self, t):
assert type(t) is datetime.time
self.sun.rise = t
def SetSunSet(self, t):
assert type(t) is datetime.time
self.sun.set = t
其中RiseSet
是一个简单的类:
def __init__(self, r=None, s=None):
# rise (r) and set (s) times should normally be datetime.time types
# but it is possible for there to
# be no sun/moon rise/set on a particular day so None is also valid.
if r is not None:
assert type(r) is datetime.time
if s is not None:
assert type(s) is datetime.time
if r is not None and s is not None:
assert r < s
self.rise = r
self.set = s
显然,特定日历中的每一天都有Day
个对象。它们包含在名为datetime.date
的字典(键入days
)中。现在我有四个列表,其中包含相关时段的太阳/月亮上升/设定时间:sunrises
,sunsets
,moonrises
,moonsets
并且想要设置太阳/ Day
中每个days
的月亮上升/设定时间。
现在,我可以通过四个独立的循环遍历四个列表中的每一个。但我真正想做的是有效地使用像指向函数的指针,所以我可以有类似的东西:
for (func, obj) in zip([Day.SetSunRise, Day.SetSunSet, Day.SetMoonRise, Day.SetMoonSet], [sunrises, sunsets, moonrises, moonsets])
我正在努力做的是获取一个指向函数的指针,但是基于类定义而不是该类的单个对象/实例。我敢肯定必须有一些简单,优雅的方式来做到这一点但我目前难倒。
任何人
答案 0 :(得分:1)
你快到了。您可以这样做,请参考Day
类上的未绑定方法,然后传入实例以调用该方法。
换句话说:Day.SetSunRise
是对未绑定方法的引用,等待您使用Day()
实例调用它:
someday = Day()
Day.SetSunRise(someday, some_sunrise_time)
未绑定方法(如函数)是对象,您可以将它们存储在列表等中:
for meth, timestamp in zip([Day.SetSunRise, Day.SetSunSet], [sunrise, sunset]):
meth(someday, timestamp)
现在你需要做的就是循环你的日落,你的日出等,将它们拉上(或以其他方式组合)与它们匹配的Day
个实例,并让你调用这个方法。