What do you call a class not intended to be instantiated

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Mon Sep 22 06:23:09 EDT 2008


Steven D'Aprano a écrit :
> On Mon, 22 Sep 2008 10:11:58 +0200, Bruno Desthuilliers wrote:
> 
>> Steven D'Aprano a écrit :
>>> I have a class which is not intended to be instantiated. Instead of
>>> using the class to creating an instance and then operate on it, I use
>>> the class directly, with classmethods. Essentially, the class is used
>>> as a function that keeps state from one call to the next.
>>>
>>> The problem is that I don't know what to call such a thing! "Abstract
>>> class" isn't right, because that implies that you should subclass the
>>> class and then instantiate the subclasses.
>>>
>>> What do you call such a class?
>>>
>>>
>> <nitpick>
>> Err... A possible design smell ?-)
>> </nitpick>
>>
>>
>> More seriously: this looks quite like a singleton, which in Python is
>> usually implemented way more simply using a module and plain functions.
> 
> 
> I really don't know why everyone thinks I want a Singleton.

May I quote you ?
"""
Instead of using the class to creating an instance and then operate on 
it, I use the class directly, with classmethods. Essentially, the class 
is used as a function that keeps state from one call to the next.
"""

> I want to 
> uncouple objects, not increase the coupling.
> 
> 
> Consider a factory function:
> 
> def factory(x):  # a toy example
>     alist = [x]
>     def foo():
>         return alist
>     return foo
> 
> 
> Now suppose we "instantiate" the factory (for lack of a better term):
> 
>>>> f1 = factory(0)
>>>> f2 = factory(0)
> 
> Even though f1 and f2 have the same behaviour, they are obviously not the 
> same object. And although both return a list [0], it is not the same list:
> 
>>>> f1() == f2() == [0]
> True
>>>> f1() is f2()
> False
 >
> 
> They have a (very little) amount of state, which is *not* shared:
> 
>>>> L = f1()
>>>> L.append(1)
>>>> f1()
> [0, 1]
>>>> f2()
> [0]
> 
> 
> But there's only a limited amount of state that functions carry around. I 
> can give them more state like this:
> 
>>>> f1.attr = 'x'
> 
> but it isn't good enough if the function needs to refer to it's own 
> state, because functions can only refer to themselves by name and the 
> factory can't know what name the function will be bound to. 

Then define your own callable type.

> As far as I know, the only objects that know how to refer to themselves 
> no matter what name they have are classes and instances. And instances 
> share at least some state, by virtue of having the same class.

Is that a problem in your use case, and if so, why ???

> (Pedants will argue that classes also share state, by virtue of having 
> the same metaclass. Maybe so, but that's at a deep enough level that I 
> don't care.)
> 
> I'm now leaning towards just having factory() instantiate the class and 
> return the instance, instead of having to do metaclass chicanery. Because 
> the class is built anew each time by the factory, two such instances 
> aren't actually sharing the same class. I think that will reduce 
> confusion all round (including mine!).
> 
> Hopefully now that I've explained what I want in more detail, it won't 
> seem so bizarre. Factory functions do it all the time. Is there a name 
> for this pattern?
> 
> Thanks to everyone who commented, your comments helped me reason out a 
> better alternative to what I first suggested.
> 

Glad to know you found something helpful in all these answers, but as 
far as I'm concerned, I'm afraid I still fail to understand what exactly 
you're after...





More information about the Python-list mailing list