Am 02.11.2012 09:08, schrieb Martin Hewitson:
On 2, Nov, 2012, at 08:38 AM, Paul Rubin <no.email@nospam.invalid>
wrote:
Martin Hewitson <martinhewit...@mac.com> writes:
So, is there a way to put these methods in their own files and
have them 'included' in the class somehow? ... Is there an
official python way to do this? I don't like having source files
with 100's of lines of code in, let alone 1000's.

That code sounds kind of smelly... why are there so many methods
per class?

Simply because there are many different ways to process the data. The
class encapsulates the data, and the user can process the data in
many ways. Of course, one could have classes which encapsulate the
algorithms, as well as the data, but it also seems natural to me to
have algorithms as methods which are part of the data class, so the
user operates on the data using methods of that class.

This is largely a matter of taste and a question of circumstances, but I'd like to point out here that your "natural" is not universal. If you take a different approach, namely that a class should encapsulate in order to maintain its internal consistency but otherwise be as small as possible, then algorithms operating on some data are definitely not part of that data. The advantage is that the data class gets smaller, and in the algorithms you don't risk ruining the internal integrity of the used data.

Further, encapsulating algorithms into classes is also not natural. Algorithms are often expressed much better as functions. Shoe-horning things into a class in the name of OOP is IMHO misguided.

Concerning mixins, you can put them into separate modules[1]. If it is clearly documented that class FooColourMixin handles the colour-related stuff for class Foo, and reversely that class Foo inherits FooShapeMixin and FooColourMixin that provide handling of shape and colour, then that is fine. It allows you to not only encapsulate things inside class Foo but to partition things inside Foo. Note that mixins are easier to write than in C++. If the mixin needs access to the derived class' function bar(), it just calls self.bar(). There is no type-casting or other magic involved. The same applies to data attributes (non-function attributes), basically all attributes are "virtual". The compile-time, static type checking of e.g. C++ doesn't exist.


Python lets you inject new methods into existing classes (this is
sometimes called duck punching) but I don't recommend doing this.

Is there not a way just to declare the method in the class and put
the actual implementation in another file on the python path so that
it's picked up a run time?

To answer your question, no, not directly. Neither is there a separation like in C++ between interface and implementation, nor is there something like in C# with partial classes. C++ interface/implementation separation is roughly provided by abstract base classes. C# partial classes are most closely emulated with mixins.

That said, modifying classes is neither magic nor is it uncommon:

  class foo:
      pass

  import algo_x
  foo.algo = algo_x.function

Classes are not immutable, you can add and remove things just like you can do with objects.


BTW: If you told us which language(s) you have a background in, it could be easier to help you with identifying the idioms in that language that turn into misconceptions when applied to Python.

Greetings!

Uli

[1] Actually, modules themselves provide the kind of separation that I think you are after. Don't always think "class" if it comes to encapsulation and modularization!
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to