http://www.perlmonks.org?node_id=1221338


in reply to Re: OO systems and Perl 5 (Was: Recap: Future of Perl 5)
in thread OO systems and Perl 5 (Was: Recap: Future of Perl 5)

Apparently, someone in the Python project did some repenting, too. The Python 3 (and, it seems, Python 2) OO system appears to have been redone since Larry stole from Python. (see https://realpython.com/python3-object-oriented-programming/)

  • Comment on Re^2: OO systems and Perl 5 (Was: Recap: Future of Perl 5)

Replies are listed 'Best First'.
Re^3: OO systems and Perl 5 (Was: Recap: Future of Perl 5)
by LanX (Archbishop) on Aug 30, 2018 at 00:05 UTC
    What exactly? ? ?

    update

    I read all of it and this is semantically almost identical.

    Larry just reused package for class and added more freedom:

    • you can choose the name of your constructor(s) (usuall new)
    • you can bless any reference as instance container not only hashes
    • you won't have collisions between methods and instance vars
    • class attributes don't collide with object attributes

    Actually you can translate this whole tutorial almost 1-to-1 with a bit of syntactic sugar!

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

    ) python doesn't seem to have anything like a package keyword

      Semantically, you are right.

      But, that is not the issue Ovid raised in Recap: The Future of Perl 5.

      In his proposal, Ovid seeks to reduce the number of required steps and simplify the syntax in Perl 5's OO system.

      As to why I said Python's OO system seems to have changed since Larry stole from it, see the Python 3 example:

      class Dog: # Class Attribute species = 'mammal' # Initializer / Instance Attributes def __init__(self, name, age): self.name = name self.age = age # Instantiate the Dog object philo = Dog("Philo", 5)

      __init__ is called with an already "blessed" ref to an already allocated container. __init__ only sets values to the objects's fields.

      The 1-to-1 translation to Perl would be (using signatures to reduce "noise"):

      package Dog; our $species = 'mammal'; sub __init__ ($class, $name, $age) { my $self = {}; $self->{name} = $name; $self->{age} = $age; bless $self, $class; } package main; my $philo = Dog->__init__('Philo', 5);

      Even if we make __init__ more Perl-ish (still using signatures):

      sub __init__ ($class, $name, $age) { my $self = bless {name => $name, age => $age}, $class; }

      Ovid would still point out that Perl is requiring the programmer to perform 2 extra steps: Allocate the container and create a blessed reference to the container.

      I don't know which version of Python Larry stole the OO system from, so I don't know what Larry changed. But, at least to me, Perl 5's classes look more like Smalltalk classes than Python 3 classes.

        There are many object models out there, or used to be.

        Semantics count and the will to blend it into Perl 4.

        NB: Python has no packages.

        I already explained my interpretation of compromises he did for more flexibility.

        edit

        BUT I have to admit that I struggled a lot with Perlootut before reading Damian's book....

        There is a saying that emacs is not an IDE but an IDE construction set.

        The same seems to apply to Perl and OOP.

        You can mimic most of the syntactic sugar of Python, though I'd rather try copying Ruby.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice