我正在设计一个斯堪的图书馆的APICS,并陷入这样一种局面,即我认为我的想象力可能超越了斯图尔的丰富能力。
(I want to apologize to any Pythonistas who may get offended by the Ruby-ness of my design)
Basically, there is a class with a few methods on it, each of which returns self
, so that they can be chained together. So:
>>> a = MyKlass()
>>> b = a.method_one()
>>> c = b.method_two()
将与
>>> a = MyKlass()
>>> c = a.method_one().method_two()
我的问题是,能否使母心选择。 我已经学到了使用<代码>__getattr__和__bet__>
以操纵可移动物体的比照,但已无法充分执行。 现在,我有<代码>__getattr__。 核对属性,然后确定<代码> 姓名/代码”是一种方法或属性(或更准确地说,它是否可以使用)。
我的问题是,如果是可呼吁的,我需要__getattr__
来做这样的事情:
>>> class MyKlass(object):
>>> def __getattr__(self, name):
>>> # pseudocode, you get the idea...
>>> if name is callable:
>>> def callme(*args, **kwds):
>>> # do stuff
>>> return callme
>>> else:
>>> # just return the attribute
因此,它归还了一个可提的物体。 然而,这意味着,我 could不出使母体可以选择,因为可呼吁的物体将归还,但从未被称作:
>>> a = MyKlass()
>>> c = a.method_one.method_two # AttributeError, since a bound function object does not have attribute "method_two"
我认为这样做的唯一途径是能够在守则中“展望未来”,并确定“<>代码><>>/代码>是否随后是括号。 然后,如果<代码> 姓名/代码>是可称呼的,但又无人称呼,我可以不提出理由而退回<代码> 姓名/代码>的结果。
我认为,这或许是站不住脚的,但我认为,我会问一看问题。