Implement logic on object.attribute and object.attribute()
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sun Nov 24 08:45:07 EST 2013
On Sun, 24 Nov 2013 05:04:16 -0800, Devin Jeanpierre wrote:
> On Sun, Nov 24, 2013 at 4:52 AM, Marc Aymerich <glicerinu at gmail.com>
> wrote:
>> Hi,
>> I'm playing with python internals to make objects behave like this:
>>
>> if I access to "object.attribute" I want to return the result of an
>> HTTP GET request. However if i call "object.attribute()" I want an HTTP
>> POST request to be executed.
>
> Uh oh. What you want is impossible. You cannot call an attribute without
> first accessing it. :(
Not quite impossible. All you need is an object that behaves like a
string, except it has a __call__ method. Here's a sketch of a solution,
completely untested.
class CallableString(str):
# Like a string, but callable.
def function(self):
raise NotImplementedError(
"this must be overridden on the instance"
)
def __call__(self):
return self.function()
class Magic_HTTP_Thing:
@property
def attribute(self):
result = CallableStr(self.do_get())
result.function = lambda: self.do_put()
def do_get(self):
# Do a HTTP GET request.
return "Get stuff"
def do_put(self):
# Do a HTTP PUT request.
return "Put stuff"
Possible or not, it doesn't seem like a reasonable API to me.
--
Steven
More information about the Python-list
mailing list