reflects conundrum introduced by the metaclass model because classes are now instances of metaclassesand because metaclasses can define built-in operator methods to process the classes they generatea method call run for class must skip the class itself and look one level higher to pick up method that processes the classrather than selecting the class' own version its own version would result in an unbound method callbecause the class' own method processes lower instances this is just the usual unbound method model we discussed in the prior but is potentially aggravated by the fact that classes can acquire type behavior from metaclasses too as resultbecause classes are both types and instances in their own rightall instances are skipped for built-in operation method lookup this is supposedly applied to normal instances for uniformity and consistencybut both non-built-in names and direct and explicit calls to built-in names still check the instance anyhow though perhaps consequence of the new-style class modelto some this may seem solution arrived at for the sake of usage pattern that was more artificial and obscure than the widely used one it broke its role as optimization path seems more defensiblebut also not without repercussions in particularthis has potentially broad implications for the delegation-based classesoften known as proxy classeswhen embedded objects implement operator overloading in new-style classessuch proxy object' class must generally redefine any such names to catch and delegateeither manually or with tools the net effect is to either significantly complicate or wholly obviate an entire category of programs we explored delegation in and it' common pattern used to augment or adapt another class' interface--to add validationtracingtimingand many other sorts of logic though proxies may be more the exception than the rule in typical python codemany python programs depend upon them implications for attribute interception in simple termsand run in python to show how new-style classes differindexing and prints are routed to __getattr__ in traditional classesbut not for new-style classeswhere printing uses default: class cdata 'spamdef __getattr__(selfname)print(namereturn getattr(self datanameclassic in xcatches built-ins ( [ __getitem__ as of this interaction listingsi've started omitting some blank lines and shortening some hex addresses to bits in object displaysto reduce size and clutter ' going to assume that by this point in the bookyou'll find such small details irrelevant advanced class topics