1
class Document(object):
    def __init__(self,filename):
        self.filename = filename
        self.edits    = 0

    def write(self,content):
        print "D.write"
        fd = open(self.filename,"w")
        fd.write(content)
        fd.close()
        self.edits += 1

class HTMLDocument(Document):
    def edit(self,content):
        print "HTMLD.edit"
        self.validate(content)
        # Document.write(self,content)
        super(HTMLDocument,self).write(content)

    def validate(self,content):
        return True

class UpperCaseDocument(Document):
    def edit(self,content):
        print "UCD.edit"
        content = content.upper()
        # Document.write(self,content)
        super(UpperCaseDocument,self).write(content)        

class UpperCaseHTMLDocument(HTMLDocument,UpperCaseDocument):
    def edit(self,content):
        super(UpperCaseHTMLDocument,self).edit(content)
        # HTMLDocument.edit(self,content)        
        # UpperCaseDocument.edit(self,content)

index   = UpperCaseHTMLDocument("index.html")
content = "<html> hi there ! </html>"
# First Edit
index.edit(content)
# Second Edit
# content.replace("t","z")
# index.edit(content)
print index.edits

### output

>>> HTMLD.edit
D.write
1
>>>

输出中没有“UCD.edit”,这意味着没有调用 UpperCaseDocument.edit。我错过了什么?

谢谢你的帮助。

(如果您认为 super 只会调用一个基类方法,请使用以下代码进行测试:

class A(object):
    def save(self):
        print "A saves"

class B(A):
    def save(self):
        self.validate()
        print "B validates and saves"
        # A.save(self)
        super(B,self).save()

    def validate(self):
        return True

class C(A):
    def save(self):
        self.validate()
        print "C validates and saves"
        # A.save(self)
        super(C,self).save()

    def validate(self):
        return True

class D(B,C):
    def save(self):
        print "D validates and saves"
        self.validate()
        # B.save(self)
        # C.save(self)
        super(D,self).save()

    def validate(self):
        return True


d = D()
d.save()    


# output 
>>> D validates and saves
B validates and saves
C validates and saves
A saves
>>> 

# Both B.save and C.save get called from super.
4

0 回答 0