rail shafigulin wrote:
i'm trying to learn OOP, python and pygame at the same time. so far it has
been ok, but i stumbled onto a problem

Hugo has already pointed out that you mispelled __init__, and that in Python 3 you don't need to explicitly provide arguments to super().

class BaseSprite(pygame.sprite.Sprite):
  def __init(self, imagefile):
    super(type(self), self).__init__()

Should be written like this in Python 3:

    def __init__(self, imagefile):
        super().__init__()


However, for those still using Python 2.x, you might be tempted to write this:

    def __init__(self, imagefile):
        super(type(self), self).__init__()  # NO! Don't do this!


This does not work! But you might be fooled into thinking it does work, because it *seems* to work if you only check a simple example:

class Base(object):
    def __init__(self):
        print "Base called"

class Subclass(Base):
    def __init__(self):
        print "Subclass called"
        super(type(self), self).__init__()  # Wrong!


It seems to work:

>>> x = Subclass()
Subclass called
Base called


But watch what happens when we subclass again:

class AnotherSubclass(Subclass):
    def __init__(self):
        print "AnotherSubclass called"
        super(type(self), self).__init__()


>>> y = AnotherSubclass()
AnotherSubclass called
Subclass called
Subclass called
Subclass called
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
  File "<stdin>", line 4, in __init__
  File "<stdin>", line 4, in __init__
  File "<stdin>", line 4, in __init__
  ...
RuntimeError: maximum recursion depth exceeded



The problem is that inside Subclass.__init__ the call to super(type(self), self) does not necessary give super(Subclass, self). If the instance being created is from AnotherSubclass, you get super(AnotherSubclass, self) inside the Subclass.__init__, which then loops forever.

So in Python 2.x, you must explicitly give the class. You can't use type(self).



--
Steven
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to