当我有多个对象时,如何间接引用类中定义的方法

时间:2013-07-16 11:02:14

标签: python object python-2.7

对于这个问题的笨拙标题感到抱歉,但我想不出一个合适的表达方式。我正在使用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)中。现在我有四个列表,其中包含相关时段的太阳/月亮上升/设定时间:sunrisessunsetsmoonrisesmoonsets并且想要设置太阳/ Day中每个days的月亮上升/设定时间。

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

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

我正在努力做的是获取一个指向函数的指针,但是基于类定义而不是该类的单个对象/实例。我敢肯定必须有一些简单,优雅的方式来做到这一点但我目前难倒。

任何人

1 个答案:

答案 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个实例,并让你调用这个方法。