[Python-ideas] JavaScript-Style Object Creation in Python (using a constructor function instead of a class to create objects)
Simon Ramstedt
simonramstedt at gmail.com
Sun May 14 03:59:30 EDT 2017
On Sunday, May 14, 2017 at 3:05:46 AM UTC-4, Steven D'Aprano wrote:
>
> On Sun, May 14, 2017 at 04:07:44AM +0000, Simon Ramstedt wrote:
> > Hi, do you have an opinion on the following?
>
> Hi, and welcome, and of course we have an opinion! This is Python-Ideas,
> we're very opinionated :-)
>
> Thanks!
> > Wouldn't it be nice to define classes via a simple constructor function
> (as
> > below) instead of a conventional class definition?
>
> No.
>
> > *conventional*:
> >
> > class MyClass(ParentClass):
> > def __init__(x):
> > self._x = x
> > def my_method(y):
> > z = self._x + y
> > return z
>
> Looks good to me. It is nicely explicit that you're creating a class,
> the superclass or superclasses are easy to see, and the attributes are
> explicit.
>
>
> > *proposed*:
> >
> > def MyClass(x):
>
> That is the exact same syntax for defining a function called "MyClass",
> that takes one argument, x. How is Python (and the reader!) supposed to
> tell which calls to def return a class and which return a function?
>
>
> > self = ParentClass()
>
> What if you have multiple parent classes?
>
> Right, the parent class would have to specifically written to allow
that e.g. via:
def ParentClass(obj=None):
self = obj or Object()
...
> Why is self an instance of the parent class, instead of MyClass?
>
That's what I've tried to cover under "(+/-) Checking types: ..."
> > def my_method(y):
> > z = x + y
> > return z
>
> The local variable x is not defined. Wait, is that supposed to come from
> the closure def MyClass(x)?
>
> What if your class has twenty methods, each of which takes different
> arguments? Do you have to write:
>
> def MyClass(x, # used in my_method
> y, # used in another_method
> z, # used in third_method,
> a, b, c, # used in fourth_method
> ... # blah blah blah
> ):
>
> How does this generalise to non-toy classes, classes with more than one
> method?
>
> def MyClass would basically as a replacement for __init__. Using __init__
instead for your example would also not be perfect:
def __init__(self, x, y, z, a, b, c):
self._x = x
self._y = y
...
The point is though, that you could still do exactly the same if you wanted
to:
def MyClass(x, y, z, a, b, c):
self = SuperClass()
self.x = x
self._y = y
...
def my_method():
self.x += 5
return self.x + self._y
...
> > self.my_method = my_method # that's cumbersome (see comments
> below)
> > return self
> >
> >
> > Here are the pros and cons I could come up with for the proposed method:
> >
> > (+) Simpler and more explicit.
>
> I think you mean "More complicated and less explicit".
>
> Is this supposed to be some sort of prototype-based OOP instead of
> class-based OOP? I'd be interested in investigating prototype-based
> objects, but I don't think this is the way to do it.
>
>
>
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python... at python.org <javascript:>
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170514/d6c1ae75/attachment-0001.html>
More information about the Python-ideas
mailing list