Re: Global Variables in OOP and Python
Available news archives: comp.lang.tcl - comp.lang.python - comp.security.firewalls - sci.crypt - comp.lang.php - comp.lang.javascript
Google
 
Web news.hping.org


comp.lang.python archive

Re: Global Variables in OOP and Python

From: Steven D'Aprano <steve@REMOVETHIScyber.com.au>
Date: Sat Dec 31 2005 - 01:37:38 CET

On Fri, 30 Dec 2005 15:03:54 -0800, newbie wrote:

> Hello,
>
> I have questions about global variables in OOP (in general) and Python
> (in specific). I understand (I think) that global variables are
> generally not a good idea. However, if there are variables that need to
> be accessed by a number of classes that exists in separate namespaces
> (files), what would be the best way to do this?
>
> So far, I have approached the problem by making the variables
> attributes of one class and passing instances of the class as variables
> to the other class' methods.

Do you mean something like this?

# Module care_and_feeding

import birds
import foods

def feed_my_pet():
    pet = birds.Parrot("Norwegian Blue")
    snack = foods.Spam("A tasty meat-like treat")
    pet.eats(snack)
    return "Yummy!"

That is a good way of handling the problem.

> The other way I thought of is to create a separate class that consists
> of the variables and to use the
>
> from <file name> import *
>
> in all of the files (namespaces) where it is needed.

That's a bad way of handling it. It has all the worst aspects of using
global variables, plus the worst aspects of import * (namespace pollution
and shadowing of existing names).

Unless I'm badly mistaken, Guido has decided that "from module import *"
was a mistake, and that will be removed from the (legendary) Python 3, if
and when it gets created. In the meantime, it is highly recommended that
you don't use that form.

> Is there a better way?
>
> Are the two ideas presented above acceptable? If so, is one better than
> the other from an OOP POV?

I think the first way is fine, but of course the Devil is in the details:
I can't judge your code without seeing it.

-- 
Steven.
Received on Tue Jan 3 03:27:55 2006