Pythonのdateutil.rruleモジュールは、カスタム__str__
方法とrrule
オブジェクト、ならびに逆の操作を行う方法rrulestr
を有し、すなわち、rrule
オブジェクトを再構成しますその文字列表現から。ここでは、その使用の実例である:説明
In [1]: from dateutil.rrule import *
In [2]: my_rrule = rrule(DAILY, count=2)
In [3]: list(my_rrule)
Out[3]:
[datetime.datetime(2016, 11, 25, 19, 58, 40),
datetime.datetime(2016, 11, 26, 19, 58, 40)]
In [4]: list(rrulestr(str(my_rrule)))
Out[4]:
[datetime.datetime(2016, 11, 25, 19, 58, 40),
datetime.datetime(2016, 11, 26, 19, 58, 40)]
私は別のオブジェクトと似た何かをしたいと思いますので、私はこれがRRULEのsource codeに実装される方法を理解しようとしています。ここではそれが含まれているものの「凝縮」の抜粋です。私はそれを理解したよう
class _rrulestr(object):
def _parse_rfc(self, s,
dtstart=None,
cache=False,
unfold=False,
forceset=False,
compatible=False,
ignoretz=False,
tzinfos=None):
global parser
def __call__(self, s, **kwargs):
return self._parse_rfc(s, **kwargs)
rrulestr = _rrulestr()
、_rrulestr
クラスに定義された__call__
方法は、それが本質的機能のように動作します。このアプローチの利点は何ですか?単に関数として直接rrulestr
を定義するのはなぜですか?そして、誰かが私にこれをどのようにして一歩一歩説明することができますか?
P.S.私はこのスタイルの「呼び出し可能なクラス」を模倣することにも問題があります。私は
#!/usr/bin/env python3.5
class CallableClass(object):
def __call__(self, arg):
return arg
print(CallableClass("Hello"))
をしようとした場合たとえば、私はTypeError
を得る:
Traceback (most recent call last):
File "/home/kurt/Documents/Scratch/call_test.py", line 7, in <module>
print(CallableClass("Hello"))
TypeError: object() takes no parameters
が、私は、この例では、_rrulestr
大差でどのように表示されないのですか?