[Zope] Problem with properties in inherited ZClasses

Steve Alexander steve@cat-box.net
Sat, 23 Sep 2000 09:33:30 +0100


Stephen Simmons wrote:

>
> I have tried to create another ZClass, AdminTools:Task that inherits from
> AdminTools:Folder that adds some task tracking functionality and
> uses/overrides the AdminTools:Folder methods for displaying objects

I tend to try not to have ZClasses derive from other ZClasses. You'd 
find it more straightforward either to derive both ZClasses from a 
common Python base class, or to keep both ZClasses independent of each 
other.

In general, I try to avoid using inheritence. Python and Zope support 
polymorphism whether you derive classes from the same base-class or not. 
Also, I find the coupling introduced by inheritence more trouble than it 
is worth for the reduced redundancy.

I realize that I have avoided trying to answer why ZClasses work in this 
way.

>   File D:\Dev\ZopeTestbed\lib\python\OFS\PropertySheets.py, line 235, in
> _setProperty
>     (Object: Task)
> Bad Request: (see above)
> 
> I don't understand why I can add the 'title' property to Task but not
> 'description'.

Here's the code that is raising the exception:

if hasattr(aq_base(self),id):
if not (id=='title' and not self.__dict__.has_key(id)):
raise 'Bad Request', (
'Invalid property id, <em>%s</em>. It is in use.' % id)

You can see that 'title' has a special status as a property.

 
> To conclude:
> 
> (i) What is going on and how can I fix it?

Don't do things that way to start with.

> (ii) When using a ZClass as a base class, do instances inherit any
> properties, or do they just get access to the base class's methods? If
> ZClasses do inherit properties from parent ZClasses, how do I reach them via
> the property sheets?

If you add propertysheets to instances of your classes, rather than to 
the classes, then you don't get conflicts over attributes. However, 
unless you use ZPatterns or something like that, you have to refer to 
the attributes of propertysheets explicitly naming the propertysheet.

> (iii) Is there a simple way to find out what methods and properties an
> object has? I would like to see what it defines, what it inherits and what
> it acquires.

Yes. See the code above from PropertySheets.py. Use something like this 
in an external method to find out the attributes of an object. (In 
python, methods and fields are both attributes.) You can use the magic 
aq_* attributes of acquisition wrappers to walk through the objects that 
get considered during acquisition. You might also want to look at Shane 
Hathaway's Acquisition Explainer, an external method to show how 
acquisition works, that also demonstrates use of the aq_* attributes.

--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net