Path: csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!feeder.erje.net!us.feeder.erje.net!news2.arglkargh.de!news.swapon.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Gregory Ewing Newsgroups: comp.lang.python Subject: Re: Type of an object: Date: Thu, 19 Dec 2013 00:45:02 +1300 Lines: 17 Message-ID: References: <52af7bfe$0$29976$c3e8da3$5496439d@news.astraweb.com> <52b0006a$0$29973$c3e8da3$5496439d@news.astraweb.com> <52b06902$0$29976$c3e8da3$5496439d@news.astraweb.com> <52b0e36b$0$6512$c3e8da3$5496439d@news.astraweb.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net XSdvTfofcXYI+SzuZquA8wqk4+jy8/lQ0elMXf1F1xaZPKX0pq Cancel-Lock: sha1:FLMN2Uif7BAoYC1rlGrtzfhq/AM= User-Agent: Mozilla Thunderbird 1.0.5 (Macintosh/20050711) X-Accept-Language: en-us, en In-Reply-To: Xref: csiph.com comp.lang.python:62294 Ethan Furman wrote: >> This leads to another question: we've now seen two examples where >> (presumably) the internal type field and __class__ differ. In the >> weakproxy case, type(obj) returns the internal type field. In the >> "regular" case, where you set obj.__class__ to a class, type(obj) returns >> the new (external) type. How the hell does it decide which one to return? When you set the __class__ of a regular object and it succeeds, it actually changes the internal type, i.e. obj->ob_type at the C level. This is only allowed under certain conditions. Mostly only for user-defined classes, and only if the layouts of the old and new instance structs are compatible. -- Greg