On 25/08/12 04:22, Matt Gregory wrote:
Is it possible to create a subclass of a superclass that doesn't have an
__init__ and is only created through another class.
Here is an example of what isn't working:
class Spam(object):
def __new__(cls, *args):
return super(Spam, cls).__new__(cls, args)
def __init__(self):
raise AttributeError('Cannot create Spam')
That will prevent anything from successfully initialising a Spam
instance. It doesn't prevent anything from creating a Spam instance,
only initialising it. Anyone can simply call Spam.__new__ directly,
and bypass the booby-trap in __init__.
Why do you want to do this?
class SubSpam(Spam):
def __new__(cls, *args):
return SpamMaker().make_spam()
While it is legal for a class __new__ method to return an instance
of a different class, that should be considered very unusual. Why
do you want SubSpam(*args) to return a Spam instance instead of a
SubSpam instance?
def test(self):
print 'This is a SubSpam class'
[...]
My real use case is using the Python bindings to GDAL and trying
to create a subclass of gdal.Band which can't be instantiated
directly.
That's not a use-case. A use-case is a real-world problem that you
are trying to solve. You have skipped the problem and jumped straight
to what you think is the solution: "create a subclass which can't be
instantiated directly".
I can't imagine any problem where the solution to the problem depends
on whether or not you instantiated a subclass using:
Spam(*args)
or
SpamMaker.make(*args)
Why do you care if Spam is called directly?
--
Steven
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor