Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bindable classes #12953

Closed
nthiery opened this issue May 16, 2012 · 6 comments
Closed

Bindable classes #12953

nthiery opened this issue May 16, 2012 · 6 comments

Comments

@nthiery
Copy link
Contributor

nthiery commented May 16, 2012

From the documentation:

    Bindable classes

    This class implements a binding behavior for nested classes that
    derive from it.

    EXAMPLES:

    Let us consider the following class ``Outer`` with a nested class ``Inner``::

        sage: from sage.misc.nested_class import NestedClassMetaclass
        sage: class Outer:
        ...       __metaclass__ = NestedClassMetaclass # workaround for python pickling bug
        ...       def f(self, *args):
        ...           print self, args
        ...
        ...       @staticmethod
        ...       def f_static(*args):
        ...           print args
        ...
        ...       class Inner:
        ...           def __init__(self, *args):
        ...               print args
        sage: obj = Outer()

    By default, when Inner is a class nested in Outer, accessing
    ``obj.Inner`` returns the ``Inner`` class as is::

        sage: obj.Inner is Outer.Inner
        True

    In particular, ``obj`` is completely ignored in the following call::

        sage: x = obj.Inner(1,2,3)
        (1, 2, 3)

    This is similar to what happens with a staticmethod::

        sage: obj.f_static(1,2,3)
        (1, 2, 3)

    In some cases, we would want instead Inner to receive ``obj`` as
    parameter, like in a usual method call::

        sage: obj.f(1,2,3)
        <__main__.Outer object at ...> (1, 2, 3)

    To this end, ``obj.f`` returns a *bound method*::

        sage: obj.f
        <bound method Outer.f of <__main__.Outer object at ...>>

    so that ``obj.f(1,2,3)`` is equivalent to::

        sage: Outer.f(obj, 1,2,3)
        <__main__.Outer object at ...> (1, 2, 3)

    ``BindableClass`` gives this binding behavior to all its subclasses::

        sage: from sage.misc.bindable_class import BindableClass
        sage: class Outer:
        ...       __metaclass__ = NestedClassMetaclass # workaround for python pickling bug
        ...
        ...       class Inner(BindableClass):
        ...           " some documentation "
        ...           def __init__(self, obj, *args):
        ...               print obj, args

    Now, ``obj.Inner(1,2,3)`` is equivalent to Outer.Inner(obj, 1,2,3)::

        sage: obj = Outer()
        sage: x = obj.Inner(1,2,3)
        <__main__.Outer object at ...> (1, 2, 3)

This feature will be extensively used for implementing SetsWithRealizations; see e.g. #12959 and the upcoming NCSF #8899 patch

CC: @sagetrac-sage-combinat

Component: misc

Keywords: days38

Author: Nicolas M. Thiéry

Reviewer: Franco Saliola

Merged: sage-5.1.beta1

Issue created by migration from https://trac.sagemath.org/ticket/12953

@nthiery
Copy link
Contributor Author

nthiery commented May 17, 2012

comment:1

For the record: all tests passed for me with 5.0.rc0 and the sage-combinat queue applied up to this patch.

@nthiery
Copy link
Contributor Author

nthiery commented May 17, 2012

Reviewer: Franco Saliola

@nthiery

This comment has been minimized.

@nthiery
Copy link
Contributor Author

nthiery commented May 19, 2012

Changed keywords from none to days38

@nthiery
Copy link
Contributor Author

nthiery commented May 19, 2012

comment:2

Attachment: trac_12953_bindable_class-nt.patch.gz

On behalf of Franco:

Comment: A variant would be to implement this feature using a class decorator. Practice will tell if we would need that variant. One advantage (or maybe sometimes an inconvenient?) of doing it by inheritance as implemented here is that all subclasses benefit from it, like, e.g., for UniqueRepresentation.

Positive review!

@jdemeyer
Copy link
Contributor

Merged: sage-5.1.beta1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants