Ben Finney at 2018/6/18 PM 03:29 wrote:
Jach Fong <jf...@ms4.hinet.net> writes:

I also make a test of my own and it fails too.

class A:
...     objs = []
...     def __init__(self, exists=False):
...             if exists:  self = self.objs[0]

The function parameters (bound here to the names ‘self’, ‘exists’) are
in the local function scope. After the function ends, the scope of those
names ends; those name bindings no longer affect anything. So, changing
what ‘self’ refers to has no effect on the A instance that exists.

In other words: Creating the instance is the responsibility of the
constructor method (a class method named ‘__new__’), and that instance
is what gets passed to the instance initialiser (an instance method
named ‘__init__’).

The initialiser has no control over what instance gets passed in, and no
control over that same instance being returned from the constructor.

What I expect is that id(a0) and id(a1) has the same value. They
should points to the same object.

You can't get that effect from within the instance initialiser. What you
need to do is change the class constructor (named ‘__new__’), and that's
a more advanced topic I leave you to research on your own.

class B:
    _obj = None
    def __new__(*args, **kwargs):
        if not B._obj:
            B._obj = object.__new__(*args, **kwargs)
        return B._obj

b0 = B()
b1 = B()
assert b0 is b1

Although it passed the first examination, I have no idea if it can
work correctly in the real application:-)

--Jach

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

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

Reply via email to