<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<body bgcolor="#ffffff" text="#000000">
Benjamin Kaplan wrote:
  <div class="gmail_quote">On Fri, May 29, 2009 at 9:41 PM, Lie Ryan <span
 dir="ltr"><<a moz-do-not-send="true"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0px 0px 0px 0.8ex; padding-left: 1ex;"
 class="gmail_quote">Ikon wrote:<br>
> I'm rather new to Python. I have PHP for my main language and I do<br>
> some Java. They all have a very strict OO schema. As I red through<br>
> Python's tutorial it seams it has nothing of those rules. No
> abstract classes, functions, or variables.<br>
> I wish someone, who has experience in both Java/PHP/C# and Python<br>
> would tell me how mush better/worse is it to program in a language<br>
> that misses most of the OO parts!<br>
Some of the concepts that you are looking for might be present in
Python but may look different than you expect.   If you are defining OO
in terms of rules and constraints, Python might come up short.   But if
you are looking for the <i>benefits</i> of OOP, Python does quite well.<br>
I have experience with all of those languages.  More Java than PHP and
C#, so I can talk about Python and Java.<br>
Originally, the definition of OOP was about concepts such as loose
coupling, reusable components, focusing on things rather than
procedures, etc.  Later the prevalent definition became more about what
you are not allowed to do than how to do what you want to do.  So now
we put more stress on ideas like strict encapsulation.  For example,
some purists even suggest that you can't claim to implement
encapsulation unless you guarantee that there is no possible way to
determine implementation details from outside.  Python "fails" here
because it has introspective features that allow you to bypass the
limitations that are deemed necessary for some artificially strict
definition of OOP.  For example strictly speaking we don't have private
members, but we can start a name with underscore or double-underscore
which for all practical purposes gives all the advantages of private
members if we assume a certain level of maturity from our programmers. 
A less restrictive notion of encapsulation might be that objects can be
managed without the need to know the implementation details.<br>
If you think in terms of the enabling qualities of OOP, but not the
constraints, Python does in fact score quite high.  We have multiple
inheritance, abstraction (in the non-fascist sense), encapsulation
(again in the non-fascist sense), really easy polymorphism, and plenty
of support for decoupling.<br>
When people claim that python is not OO, they are for the most part
only able to cite what python fails to prevent you from doing, not what
python fails to allow you to do.  At the same time, I must admit that
the constraints imposed by stricter languages, such as compile time
detection of certain errors, and performance benefits associated with
static typing.  Fortunately, tools such as pylint and psyco can close
these two respective gaps to a significant degree.<br>
Okay, enough theory and straw man arguments :)  Here's how it <i>feels</i>
to me.<br>
What is missing from Python, as compared to Java, is an oppressive
system to prevent you from writing bugs no matter what.  As it turn
out, I found that I was quite capable of writing bugs in Java in spite
of it's extreme efforts to save me from myself.  I also found that Java
requires a great deal more lines of code to get to the desired
results.  Most of the lines of code are about making the compiler
happy.  If I try to do anything metaprogrammingish in Java, I soon
start pulling my hair out.  After switching to mostly python, I have
grown nearly all of my hair back.<br>
Once the Java compiler is happy with the syntax, certain kinds of bugs
are prevented that might exist in corresponding python code.  This is a
win for Java.  However, because the code is more complex in Java, and
because it is harder to add clever introspective debugging
instrumentation, the remaining bugs are harder to find.  I believe that
all other things being equal, less code is more robust than more code.<br>
I highly recommend using pylint, BTW.  If you use pylint, you are just
about as safe as you would be with a more oppressive language.<br>
When it is all done, I find that I can get to a bug free, scalable,
flexible, object oriented result much more quickly in Python than in
Java, but YMMV.<br>
In summary, Python has all of the capabilities of OOP, but lacks some
of the constraints of OOP.  This lack of constraints has it's
advantages and disadvantages, but on the whole, I like it.  What else
can I say?<br>
See also:<br>
  <a class="moz-txt-link-freetext" href="http://www.ferg.org/projects/python_java_side-by-side.html">http://www.ferg.org/projects/python_java_side-by-side.html</a><br>