On Mon, Mar 02, 2015 at 11:57:09AM +0100, Martin Teichmann wrote:
Imagine a soliton-generating metaclass:
class Soliton(type): def __new__(cls, name, bases, ns): self = super().__new__(name, bases, ns) return self()
You have to pass cls as an explicit argument to __new__, otherwise you get a TypeError: TypeError: type.__new__(X): X is not a type object (str) (that's in Python 3.3). The line should be: self = super().__new__(cls, name, bases, ns)
And generate such a soliton:
class A(metaclass=Soliton): def f(self): print(__class__)
As of now, writing "A.f()" interestingly prints "<__main__.A object>", so __class__ is indeed set to what Soliton.__new__ returns, the object, not the class.
Is "soliton" the usual terminology for this? Do you perhaps mean singleton? I've googled for "soliton" but nothing relevant is coming up.
This is currently correct behavior, but I think it actually is not what one expects, nor what one desires. (Does anyone out there make use of such a construct? Please speak up!)
I do now! Seriously, I think you have just solved a major problem for me. I'll need to do some further experimentation, but that is almost exactly what I have been looking for. I've been looking for a way to have a class statement return a custom instance and I think this might just do it. -- Steve