0

抱歉这个问题的标题很笨拙,但我想不出合适的方式来表达它。我正在使用 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.datedays中。现在我有四个列表,其中包含相关期间的太阳/月亮升起/落下时间:sunrisessunsetsmoonrises和想要为每个inmoonsets设置太阳/月亮升起/落下时间。Daydays

现在我可以有四个单独的循环遍历四个列表中的每一个。但我真正想做的是有效地使用指向函数的指针之类的东西,所以我可以有类似的东西:

for (func, obj) in zip([Day.SetSunRise, Day.SetSunSet, Day.SetMoonRise, Day.SetMoonSet], [sunrises, sunsets, moonrises, moonsets])

因此,我想要做的是有效地获取指向函数的指针,但基于类定义而不是该类的单个对象/实例。我敢肯定必须有一些简单,优雅的方式来做到这一点,但我目前很难过。

有人吗?

4

1 回答 1

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实例压缩(或以其他方式组合)并让您调用该方法。

于 2013-07-16T11:14:29.907 回答