[TransWarp] PyProtocols: adapting classes to instance
Ian Bicking
ianb at colorstudy.com
Sun Sep 28 15:54:16 EDT 2003
I wasn't sure if this is the right place to post questions about
PyProtocols...
Anyway, I want to adapt classes to instances of those classes. So you
could do something like:
class MyValidator(Validator):
protocols.advise(instancesProvide=[IValidator])
....
adapt(MyValidator, IValidator)
# --> MyValidator()
This way classes can be used in place of instances in most cases (and
obviously the classes are written with this in mind). But I haven't
been sure how to do this.
I tried using a metaclass like:
class ValidatorMeta(type):
def __new__(meta, className, bases, d):
cls = type.__new__(meta, className, bases, d)
protocols.declareAdapter(_simpleClassFactory, cls.__provides__,
forObjects=[cls])
return cls
def _simpleClassFactory(v, protocol): return v()
(I set cls.__provides__ manually because I wasn't sure how to find what
protocols an object supports from PyProtocols, but that's an aside)
Unfortunately that didn't work. I got an error 'Incompatible
__conform__ on adapted object'. I assume that's because Validator
defines a __conform__ method, which applies to instances (for
conforming validators to a different interface).
So, my basic question (if you understand what I'm trying to do) -- how
should I do it? I might be all backwards, so I'm open to any ideas.
Add an __adapt__ method to IValidator? Add a __conform__ method to
ValidatorMeta? I've tried different combinations, but to no avail.
Ian
More information about the PEAK
mailing list