説明

2016-11-25 19 views
0

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大差でどのように表示されないのですか?

答えて

1

「呼び出し可能クラス」のポイントは、呼び出し可能なインスタンスです。もちろん、クラスを呼び出すとインスタンスが得られるという意味で、どのクラスも呼び出すことができます。 __call__メソッドを定義すると、結果のインスタンスも呼び出し可能であることを意味します。

だから、あなたのコードは次のようになります。

print(CallableClass()("Hello")) 

あなたが見ることができるように、rruleモジュールは、最後にそのインスタンスを定義します。rrulestr = _rrulestr() - 、それはあなたが呼び出し、そのオブジェクトです。