Bob Cowdery wrote:
> Thanks for your help Robert. I'm still not
> understanding what I am seeing. I've forgotten
> about the objective for the moment. I just want
> to understand metaclasses.

All right; then I'll skip the speech about how metaclasses are not the solution 
you're looking for. ;) They rarely are.

> Two things I don't understand. __init__ gets called
> when I import api, not when I create an instance of
> API so the capability is set in stone on the import
> and I can't change it.

Correct. autoprop.__init__ is executed when the API class definition has 
finished executing. This is an important point about Python in general: class 
definitions are not declared so much as executed. Your API class, for example, 
has three statements that happen to be executed within the scope of a class 
definition; otherwise, they're normal Python statements and are executed like 
any other. The statements in autoprop.__init__ are executed after the last 
statement in the API class definition has executed.

Anyway, if you want your code (which binds capability methods) to occur 
per-instance, it should most likely be executed within API.__init__, and you 
don't need metaclasses at all. autoprop.__init__ is executed once per *class*, 
not once per instance. That is, if someone were to make a subclass of API, then 
autoprop.__init__ would fire again, receiving that subclass instead of the API 
class as its first argument.

> Second when I try to read attribute 'mode'
> (or any other valid attribute) I get an error.
> If I set it to some value and read it it's there.

When you set the value, you're not going through the property--it's just 
setting a new attribute on the object as you can with any Python object.

>>> class Thing(object): pass
... 
>>> t = Thing()
>>> t.stuff = 4, 5, 6
>>> t.stuff
(4, 5, 6)

I think the first thing you need to do is stop using __private members, which 
mangle their own names. ;) Drop them, get your metaclass (or other solution) 
working, then go back to __private names if you want. At the moment, it's 
confusing the issue greatly.

But why don't you just dynamically set attributes (like 'mode') instead of 
methods (like '_get_mode')? Will some of these be read-only?


Robert Brewer
MIS
Amor Ministries
[EMAIL PROTECTED]
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to