[Zope-dev] urg

Tom Deprez tom.deprez@uz.kuleuven.ac.be
Tue, 07 Mar 2000 13:22:51 +0100


Grok, this was were I'm afraid for, I don't understand what you guru's are
talking of :-(. I can follow partly, but not the essence. But, thanks for
giving me a solution. It's better to know that you still have to learn much
then just getting the answer that it isn't possible.

Since I haven't asked this q'n directly here -the question which has given
me already 3 days of headache-, perhaps some of you can share me your idea
on how to solve this problem. (The q'ns I asked before on this list are
directly descending from this q'n):

How can a ZClass know when it is moved and how can you add some code to it,
so this code is executed when the ZClass is moved. 

Tom.

At 03:51 07/03/2000 -0800, Michel Pelletier wrote:
>Tom Deprez wrote:
>
>> "Quote Martijn"
>> im_func is a part of Python introspection. It is the pure function
>> definition of a class, not bound to that class, so I can pass in an
>> alternate self.
>
>Aiee!  Split personality objects!
> 
>> I am trying to call a superclass method here, and normally
>> CatalogAware.index_object() would suffice. But because of Extension
Classes,
>> Python gets confused as to what is a class method, and what is a regular
>> function. It will accuse me of calling an unbound method, which of course I
>> am not. I circumvent this by calling the unbound function, and passing in
>> self explicitly.
>
>Then this sounds like a bug in ExtensionClass, shouldn't it be able to
>grock that CatalogAware.method(instance) is a class method bound to
>instance?
>
>Dammit I've seen this somewhere before... ah, this might be it, quothe
>the ExtensionClass documetation:
>
>  Overriding methods inherited from Python base classes
>
>    A problem occurs when trying to overide methods inherited from
>    Python base classes.  Consider the following example::
>
>      from ExtensionClass import Base
>
>      class Spam:
>
>        def __init__(self, name):
>	  self.name=name
>
>      class ECSpam(Base, Spam):
>
>        def __init__(self, name, favorite_color):
>	  Spam.__init__(self,name)
>	  self.favorite_color=favorite_color
>
>    This implementation will fail when an 'ECSpam' object is
>    instantiated.  The problem is that 'ECSpam.__init__' calls
>    'Spam.__init__', and 'Spam.__init__' can only be called with a
>    Python instance (an object of type '"instance"') as the first
>    argument.  The first argument passed to 'Spam.__init__' will be an
>    'ECSpam' instance (an object of type 'ECSPam').
>
>MP> ^^^^^^^^ This sounds like your problem right here ^^^^^^^^
>
>    To overcome this problem, extension classes provide a class method
>    'inheritedAttribute' that can be used to obtain an inherited
>    attribute that is suitable for calling with an extension class
>    instance.  Using the 'inheritedAttribute' method, the above
>    example can be rewritten as::
>
>      from ExtensionClass import Base
>
>      class Spam:
>
>        def __init__(self, name):
>	  self.name=name
>
>      class ECSpam(Base, Spam):
>
>        def __init__(self, name, favorite_color):
>	  ECSpam.inheritedAttribute('__init__')(self,name)
>	  self.favorite_color=favorite_color
>
>    This isn't as pretty but does provide the desired result.
>
>
>I don't think, however, that this can be used called from an external
>method.  There is no access to whatever class your method is a shared
>attribute of ('self' in an external method could be bound to all sorts
>of class instances depending on how it is called).  I could be
>completely wrong.
>
>-Michel
>