What do you call a class not intended to be instantiated

Steven D'Aprano steven at REMOVE.THIS.cybersource.com.au
Mon Sep 22 05:07:43 EDT 2008


On Mon, 22 Sep 2008 10:12:38 +1000, James Mills wrote:

> On Mon, Sep 22, 2008 at 9:39 AM, Calvin Spealman <ironfroggy at gmail.com>
> wrote:
>> I call it an obvious misuse and misunderstanding of why you'd use a
>> class in the first place. Either create an instance and not make these
>> things classmethods or just share the stuff in a module-level set of
>> variables. But the instantiating is the best options. Your class
>> attributes might not be globals, but you're still using global state
>> and you should avoid it where you can.
> 
> I concur. Use a _proper_  state object that you share amongst your other
> objects.


But that's precisely what I want to avoid: I don't want the objects to 
share *any* state, not even their class. I'm not trying for a Borg or 
Singleton: the user can call the factory as many times as they want, but 
the objects returned shouldn't share any state. I don't know if what I 
want has a name. Judging from people's reactions, I'd say probably not.

(For the pedantic: the "instances" will all have the same methods, but 
I'm not including methods as state.)



> For instance, in many of my systems and applications I write, I
> often have an "Environment" instance, which is a container object that
> holds other objects required by parts of the system. Every other
> component/object in the system that is instantiated recievees exactly
> one instnace of thie "Environment" called, "env".
> 
> Accessing shared states amongst components/objects within the system is
> as simple as this:
> 
> class Foo(object):
> 
>    def __init__(self, env, *args, **kwargs):
>       self.env = env
> 
>    def foo(self):
>       if self.env.some_state:
>          print "Do something useful"

Seems wasteful to me. Why give every instance it's own instance-level 
reference to the shared object? Why not make env a class attribute, set 
once, instead of every time you instantiate the class?


class Foo(object):
    env = env

But in any case, this is not the behaviour I want. It's the opposite of 
the behaviour I want. I don't want the objects to share state. I'm not 
exactly sure what I said that has given so many people the impression 
that I do.




-- 
Steven



More information about the Python-list mailing list