At 10:59 AM 1/11/05 +0100, Alex Martelli wrote: >all you have to do is ADD > def __conform__(self, protocol): > if issubclass(protocol, Abstract): > raise LiskovViolation > >that's all. That will raise a TypeError if protocol is not a class or type, so this could probably serve as an example of how difficult it is to write a good Liskov-violating __conform__. :) Actually, there's another problem with it; if you do this: class Y(X): pass class Z(Y): pass then 'adapt(Z(),Y)' will now fail because of a Liskov violation. It should really check for 'protocol is Abstract' or 'protocol in (Abstract,..)' in order to avoid this issue. >Basically, rephrasing private inheritance with containment and delegation >is a lot of messy work, and results in far more complicated >structures. And instead of paying the tiny price of a __conform__ call at >adaptation time, you pay the price of delegating calls over and over at >each x.tm1() call, so it's unlikely performance will improve. Well, as I mentioned in my other post, such inheritance is a lot simpler with PEAK, so I've probably forgotten how hard it is if you're not using PEAK. :) PEAK also caches the delegated methods in the instance's __dict__, so there's virtually no performance penalty after the first access. Again, not an argument that others should use PEAK, just an explanation as to why I missed this point; I've been using PEAK's delegation features for quite some time and so tend to think of delegation as something relatively trivial.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4