[Python-3000] Adaption & generic functions [was Generic functions]
Walter Dörwald
walter at livinglogic.de
Fri Apr 7 20:49:51 CEST 2006
Guido van Rossum wrote:
> On 4/7/06, Walter Dörwald <walter at livinglogic.de> wrote:
>>> Using @overloaded functions I would create an explicit class variable
>>> which is the @overloaded adapter rather than trying to make the
>>> interface also *be* the adapter. I would define the Interface class
>>> like this:
>>>
>>> class InterfaceMetaclass(type):
>>> # I hate anonymous metaclasses
>>> def __new__(mcl, name, bases, dict):
>>> # Give each class it's own registry
>>> dict["adapter"] = overloaded(None) # set default_function to None
>>> return type.__new__(mcl, name, bases, dict)
>>>
>>> class Interface:
>>> __metaclass__ = InterfaceMetaclass
>>> # No need for adapt and register methods here
>>>
>>> The registration would then look like this:
>>>
>>> Sequence.adapter.register(list)(PythonSeqAsSequence)
>>>
>>> and the invocation would look like this:
>>>
>>> print Sequence.adapter([1,2,3]).len()
>> This looks reasonable enough, as the adapter comes for free and it
>> avoids the problem of a __call__() in the Interface or its metaclass.
>>
>> But if I'm implementing an adapter for a certain type, I still can't
>> make the returned object an instance of Interface (or I could, but it
>> would inherit an adapter, which is useless),
>
> I'm not following. Why would an adapter ever return an instance of
> Interface (which is just a token object, a reification of the concept
> of an interface)?
An Interface is an abstract class that you subclass to make it a
concrete implementation. If you have an adapter that adapts to the
FooInterface why shouldn't it return a FooInterface object?
>> so I would have:
>>
>> class Interface:
>> def getitem(self, index): ...
>> def len(self, index): ...
>>
>> Interface.adapter() which I have to call to do the adaption and
>>
>> class PythonSeqAsSequence:
>> def getitem(self, index): ...
>> def len(self, index): ...
>>
>> which implements the Sequence protocol, but shouldn't subclass Sequence.
>>
>> Somehow this feels awkward to me.
>
> Why would the wrapper class need to subclass the interface class?
>
> OTOH if you really like to express implementing an interface as
> inheriting from that interface, what's the problem with inheriting the
> adapter?
The adapter isn't a class, it's either a fancy function or an object
with a __call__().
Servus,
Walter
More information about the Python-3000
mailing list