Steven D'Aprano wrote:


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)

Your factory is returning closures. This is the functional equivalent of a class returning instances.

class factory(object):
  def __init__(self, x):
    self.alist = [x]
  def __call__(self):
    return self.alist

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

same results

They have a (very little) amount of state, which is *not* shared:

L = f1()
L.append(1)
f1()
[0, 1]
f2()
[0]

same results

But there's only a limited amount of state that functions carry around.

That is why Python has class statements.

> And instances share at least some state, by virtue of having the same class.

If the only class attributes are methods and you do mutate the class, then the fact that f1.__class__ is f2.__class__ is not really shared state.

[from a later post]
>But that's precisely what I want to avoid: I don't want the objects to
share *any* state, not even their class.

Unless you can show how sharing an immutable __class__ attribute is an actual impediment, this strike me as artificial pedantry and unnecessary self handcuffing. And you obviously can make that attribute effectively immutable by ignoring it and also not changing the class itself. It is just internal, implementation-defined bookkeeping.

The identity of immutable objects is irrelevant. If part of your 'unshared state' for each instance were a string, and two instances happened to have the same string value, would you be upset because the interpreter happened to use the same string object instead of two string objects with the same value? Ditto for numbers, tuples, and so on.

Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to