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

Reply via email to