Hi Volker,

some remark:

On 2014-08-08, Volker Braun <vbraun.n...@gmail.com> wrote:
> IMHO the category 
> functionality would have been better implemented by a proper metaclass than 
> by dynamically assigning to __class__ to dynamically construct the class at 
> import time, not at construction time.

This would mean: You provide the category functionality during the
construction of the *class*, rather than during the construction time of
the *instance* of the class.

Let Foo be a class whose instances may be objects in different categories
(such as matrix spaces, which are algebras if the matrices are square, and
modules otherwise). A metaclass can easily add methods of, say,
Modules(Rings()).parent_class to Foo (until recently, you would have needed
to explicitly provide a base ring, rather than just saying that it belongs
to Rings()).

But what would you do if Foo(args) has more structure and in fact belongs to
Algebras(Rings())? I don't think that this can be solved on the level of
the class Foo, unless of course you provide Foo with a classcall
metaclass that, depending an the given arguments, dynamically creates a new
class Foo_algebras adding the methods from Algebras(Rings()).parent_class, and
then Foo(args) returns an instance of this new class Foo_algebras.

But then, how would this be any better than what the category framework is
currently doing?

Hmm. Perhaps actually it *is* better. Currently, the following happens:

1) Foo.__init__ choses a category CAT depending on the given arguments.
2) _init_category_ replaces self.__class__ by a sub-class Foo_cat, that is
dynamically created using Foo and CAT. If Foo is a cython class, then
overriding self.__class__ by Foo_cat is impossible.

With a (classcall) metaclass, we could make the following work:

1) When Foo(args) is called, we defer to Foo.__classcall__.
2) In Foo.__classcall__, the category CAT is chosen depending on the
given args. Perhaps this could be done in some static method
Foo._choose_category_.
3) Depending on CAT, a sub-class Foo_cat of Foo will be created and an instance
O of it will be created and initialised.
4) __classcall__ returns O.

Advantages of the second scenario:
- Chosing the category is done in a separate method. Looks cleaner than
  doing it in __init__.
- There will be no change of O.__class__ after creation of O, since O is
  created as an instance of Foo_cat right away.
- This would work even if Foo was a Cython class.

However, it would be an awful lot of work to change...

Best regards,
Simon


-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to