[Tutor] Using __init__ to return a value

Steven D'Aprano steve at pearwood.info
Wed Jun 12 13:42:44 CEST 2013


On 12/06/13 19:32, Khalid Al-Ghamdi wrote:
> Hi,
>
> Why doesn't this work? And is there way to have an
> object immediately return a value or object once it is instantiated with
> using a method call?

It does return a value. It returns the object that was just instantiated.

Supposed you could do what you wanted:


>     1. >>> class k:
>     2.         def __init__(self,n):
>     3.                 return n*n
>     4.
>     5.
>     6. >>> khalid=k(3)

and khalid receives the value 9. That would be useless, because the instance of class K would be immediately destroyed.

If you want to just return a value, use a function. This is the best solution:


def k(n):
     return n*n

khalid = k(3)
assert khalid == 9



Another alternative is to create a callable object:

class K:
     def __init__(self, n):
         self.n = n
     def __call__(self, arg):
         return arg * self.n

k = K(3)
k(2)
=> returns 6
k(5)
=> returns 15


A third alternative is to use the __new__ method. This only works in Python 3, or for new-style classes that inherit from object:

class K(object):
     def __new__(cls, n):
         return n*n


but don't do this. Really, don't. There are advanced uses where this is useful, but for this trivial example, you should just use a function.




-- 
Steven


More information about the Tutor mailing list