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.dateと呼ばれる ( をキーとする)辞書に含まれていdaysます。sunrisesこれでsunsets、問題moonrisesの期間の日の出/月の出/入時刻を含む 4 つのリストがmoonsetsできDayましたdays

これで、4 つのリストのそれぞれを通過する 4 つの個別のループを持つことができました。しかし、私が本当にやりたいのは、関数へのポインターのようなものを効果的に使用して、次のようなものを作成できるようにすることです。

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 に答える