Lie Ryan a écrit :
Bruno Desthuilliers wrote:
Lie Ryan a écrit :
Emanuele D'Arrigo wrote:
(snip)
Ultimately all I want is a non-callable class-level attribute
MyClass.myProperty that gives the result of MyClass.myClassMethod().
This works like what you seem to want (it's ugly):
Ugly, indeed. And an extreme case of arbitrary overcomplexification too :-/

(snip rube goldberg code)


Can't think of anything simpler than that without meddling with
descriptor.

Hmmm... Rereading the OP's spec, I guess you understood it better than I did - seems the OP wants to be able to call the "property" on the class object itself - which won't work with the builtin property type. So my own proposed solution won't do :-/

But still, "meddling with descriptor" is *way* simpler than your proposed solution. Here's a simple non-binding descriptor that do the job:

class ClsProperty(object):
    def __init__(self, fget):
        if not isinstance(fget, (classmethod, staticmethod)):
            raise ValueError(
              "fget must be a classmethod or staticmethod"
              )
        self.fget = fget

    def __get__(self, obj, cls=None):
        if cls is None:
            assert obj is not None
            cls = type(obj)
        return self.fget.__get__(obj, cls)()


# example use
class Foo(object):
    @classmethod
    def bar(cls):
        return "%s.bar" % cls.__name__

    quux = ClsProperty(bar)


I'm not even sure descriptor can help here as it seems
descriptor needs an instance?

wrt/ descriptors, no, they don't "need" an instance, at least for non-binding descriptors. Else, MyClass.MyMethod would return the MyClass.__dict__['MyMethod'] function, not an unbound method object !-)


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to