[python-users] Vererbung und Subtyping

Daniel Hepper daniel.hepper at gmail.com
Mo Mai 4 16:19:41 CEST 2009


Hallo Dirk,

was du hier tust ist glaube ich nicht das was du denkst.

> class cat:
>    def meow(self):
>        print "meow!"
>
> class dog:
>    def bark(self):
>        print "wow!"
>
> class catdog(cat,dog):
>    pass
>
> catdog1=catdog()
> print isinstance(catdog1,dog)
> catdog1.bark()

Bis hier hin ist alles soweit klar, denke ich.

> snoopy=dog()
>
> catdog2=cat()
> catdog2.bark=snoopy.bark

Hier weist du die an snoopy gebundene Methode bark einem Attribut von
catdog2 zu.

>>> print snoopy
<__main__.dog instance at 0xb7d3a0ec>
>>> print catdog2.bark
<bound method dog.bark of <__main__.dog instance at 0xb7d3a0ec>>

Ich habe dein Beispiel mal ein wenig erweitert:

>>> class cat:
...    def __init__(self, name):
...        self.name = name
...    def meow(self):
...        print "%s %s says meow!"%(self.__class__.__name__, self.name)
...
>>> class dog:
...    def __init__(self, name):
...        self.name = name
...    def bark(self):
...        print "%s %s says wow!"%(self.__class__.__name__, self.name)
...
>>> class catdog(cat,dog):
...    pass
...
>>> catdog1=catdog('catdog1')
>>> print isinstance(catdog1,dog)
True
>>> catdog1.bark()
catdog catdog1 says wow!
>>>
>>> snoopy=dog('snoopy')
>>>
>>> catdog2=cat('catdog2')
>>> catdog2.bark=snoopy.bark
>>> print isinstance(catdog2,dog)
False
>>> catdog2.bark()
dog snoopy says wow!

Wenn ich dich richtig verstanden habe, dann hättest du gerne:
>>> catdog2.bark()
cat catdog2 says wow!

Ich kann dir allerdings nicht aus dem stehgreif sagen ob/wie möglich
ist. So gehts auf jeden Fall nicht:
>>> cat.bark = dog.bark
>>> catdog3=cat('catdog3')
>>> catdog3.bark()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method bark() must be called with dog instance as
first argument (got nothing instead)

Ich hoffe das hat irgendwie zum Verständnis beigetragen.

Grüße,
Daniel




Mehr Informationen über die Mailingliste python-users