Global Variables in OOP and Python

Steven D'Aprano steve at REMOVETHIScyber.com.au
Sat Dec 31 01:37:38 CET 2005


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.




More information about the Python-list mailing list