What are modules really for?

Tito titogarcia_borra_esto at gmail.com
Wed Aug 10 12:14:34 EDT 2005


Neil Benn wrote:
> Tito wrote:
>> N.Davis wrote:
>>> Functions existing in a module? Surely if "everything is an object" 
>>> (OK thats Java-talk but supposedly Python will eventually follow this 
>>> too) then there should be nothing in a module thats not part of a class.
>>
>> Well, all data in a Python program are objects, in the sense that they 
>> have an identity on their own, and variables are only references to them.
>>
>> Why is it necessary to have all code into classes for meeting the 
>> "everything is an object" panacea?
>>
> If you don't have a class how can you combine functionality with data 
> and hold state - that is one of the points of a class.

Yes, of course. You don't have OO if you cannot define your own classes. 
I only said that I don't find it necessary to have all code confined in 
classes.

> Python has the 
> added concept that if you don;t need this you can create functions with 
> no associations - lots of languages do that but Java, Eiffel, C#, etc 
> don't have that concept.  You need to make a difference between 
> everything is an object and everything is a class here.  A programmer 
> coming from Java/C# wouldn't think about that.
>>
>>> Even a static method is simply a class function that operates on the 
>>> "collection of all instances" rather than a single instance.
>>
>> That is not true. A static method knows nothing about the instances of 
>> a  class, unless you do it your own. Besides, it will work whether you 
>> have created instances of the class or not.
>>
>> So, a static method is just a global method declared withing a class, 
>> which just serves as a namespace for it.
>>
> In java, a static method is the same as a class method in Python, you 
> can then use the cls param to access class attributes (that is what teh 
> OP implied).  However a static method can help with namespacing.  What 
> looks better :
> 
> initialise_local_message_router()
> objPublisher = get_publisher_from_local_router('bob')
> 
> or
> 
> LocalRouter.initialise()
> objPublisher = LocalRouter.getPublisher('bob')
> 
>    IMHO, the second case makes much more sense that a floating function 
> which makes things less expressive.

Yes. So we agree on the fact that the class' name serves as a namespace.

>>> Related classes in the same file? Be careful. Doesn't anything 
>>> "knowing" about anything else compromise encapsulation? Why would 
>>> properly-designed classes have such a close relationship?
>>
>> Question back: why do you think having classes defined in the same 
>> file compromises encapsulation? Classes don't know more about each 
>> other for the fact of being written into the same file. Anyway, in 
>> Python, classes know always too much from each other, don't they?, as 
>> there are no access modifiers for class attributes.
>>
> If I want to change one class and replace the file on the install then I 
> need to put a whole bunch of classes on - increasing the change of 
> making a mistake.

Sorry, I don't understand the previous sentence. What is meant by 
"replace on the install"? And by "to put a whole bunch of classes on"?

> Module scoping exists with globals, also you have the 
> convetnion of creating classes with the name of _XXX to mean module 
> level only.

Do you mean that _XXX server as an access modifier among modules? Yes, 
that can be a reason to split definitions of classes into different modules.

>>> Having back in the day worked on big real-time systems where being 
>>> very strict about encapsulation was a god-send for fighting 
>>> complexity, I feel unnerved by Perl and Python's laid-back OO culture 
>>> of "you can do it if you feel like it but don't have to".
>>>   
>>
>>
>> Well, that is the case with whatever general-purpose programming 
>> language. You have virtually an infinite number of ways to do things, 
>> and most of them are not appropriate.
>>  
>>
> Some languages are more strict than others - yes you need covnentions 
> but you will need more conventions in a less strict language.  The 
> upside is that, if you are careful, you can leverage the added oosness 
> to implement features which would be a pain in other languages.  
> Enterprise systems have different objectives than a cgi script or single 
> client install stuff.  It's a judgement call.
> 
>> The thing with Python is, in my opinion, that it wants to put all the 
>> power in your hands to do whatever you want in the fastest way 
>> possible. If I want to do something, I don't declare a class that 
>> knows how to do it, then create it and invoke the right method, I just 
>> put the code to do what I want to do. If, in between, I find that one 
>> class would make my life easier, I declare it just in place and go on. 
>> If I find repetitive tasks I can declare functions, but I won't go for 
>> a class immediately. Why do you think putting code into functions is 
>> not encapsulating?
>>
>>> While you could do all manner of nasty hacks in C++ I worked with 
>>> people who carefully avoided this.
>>
>> Well done, but messes you can do in whatever language.
>>
> Agreed but in some languages you can cause more havoc than in others, 
> look at the distinction .NET makes between managed and unmanaged code to 
> get a handle on this.

Well, I wasn't talking exactly about making use of dangerous features of 
  languages, but more about the way of using imperative object-oriented 
languages in a non-object-oriented way.

Regards,
Tito



More information about the Python-list mailing list