> I do remain a bit surprised that there seems to be no way to implement
> what I naively thought would be the obvious solution -- to remove an
> inherited method from the instance's dictionary.


Hi Brian,

If we're trying to do this, we probably don't want to "inherit" from a
parent.  A subclass child is supposed to have, at the very least, the same
public methods as its parent.  For example, if we have a:

######
class Account:
    def __init__(self, amount):
        self.amount = amount

    def withdraw(self, x):
        assert x > 0
        self.amount = self.amount - x

    def report(self):
        print "You have ", self.amount, "dollars"
#######


And we'd like to reuse this, but for something that doesn't report itself,
we shouldn't use inheritance:

#######
class SecretAccount(Account):
    def report(self):
        pass
#######


This SecretAccount is now pretending to be an account that doesn't have a
usable report() method.

#######
>>> Account(5).report()
You have  5 dollars
>>> SecretAccount(5).report()
>>>
#######



But we can get into trouble again, if, later on, Account is expanded to
have a few more additional functions:

######
class Account:  ## version 2
    # [same as before]
    def htmlReport(self):
        print ("<html><body><p>You have %d dollars</p></body></html" %
                self.amount)
######

And now, suddenly, SecretAccount again has a method that shows information
that it probably doesn't want out in the open.


The issue that that SecretAccount is really not trying to be an "Account":
it's just trying to reuse its functionality.  Instead of doing things with
inheritance, we're probably looking for delegation:

#######
class SecretAccount:
    def __init__(self, amount):
        self.account = Account(amount)
    def withdraw(self, x):
        self.account.withdraw(x)
#######

And now we're more isolated from changes to the Account class.


There are some more Pythonic idioms to make delegation easier to code.
And the example above is hideously toyish.  *grin*

But I hope the idea's a little clearer: inheritance ties the subclass down
to at least what the superclass has promised, and in many cases, that's
not what we want.


Best of wishes!

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to