单继承 具体的语法就不说了。我很关心的是它到底继承了什么 单继承条件下很简单。类的静态变量、类的静态方法、实例的方法、实例的成员变量、基类的构造函数、基类的析构函数都可以从父类中继承过来。私有方法和私有变量是不能继承的。具体看测试代码: class Student: '''this test class''' name = 'ss' age = 13 def __init__(self): self.name='bb' self.addr="shanghai" self.__love="man" print "init..." def __del__(self): print "dead..." def Run(self): print 'people Run' @staticmethod def RunStatic(): print "In Static method..." def __Good(self): print "good" class MiniStudent(Student): pass #类 print MiniStudent.name print MiniStudent.age print MiniStudent.RunStatic() print "----================--------" #实例 mini = MiniStudent() print mini.name print mini.age print mini.Run() print mini.addr 多继承 多继承下,情况明显比这复杂而且,而且会产生多个基类覆盖函数的问题。很幸运,C#中已经没有了多继承,你只能从多个接口继承。正因为这样,我感觉这种多继承应该一般不需要用,否则代码会很晦涩。下面这个例子你就可以看到。在上面的例子中,我多添加了一个StudentA的类。 具体看测试代码: class StudentA: def __init__(self): print 'init-studenta' def GoCar(self): print "Go Car" class Student: '''this test class''' name = 'ss' age = 13 def __init__(self): self.name='bb' self.addr="shanghai" self.__love="man" print "init..." def __del__(self): print "dead..." def Run(self): print 'people Run' @staticmethod def RunStatic(): print "In Static method..." def __Good(self): print "good" class MiniStudent(Student,StudentA): pass #类 mini = MiniStudent() print mini.name print mini.age print mini.Run() print mini.addr 现在这个例子是可以通过的,但如果你把 class MiniStudent(Student,StudentA) 修改成 class MiniStudent(StudentA,Student) 这个代码就通不过了。告诉你mini.addr没有定义。 其实是StudentA的构造函数覆写了Student的函数,也就是说只调用了StudentA.__init__()的方法。下面就谈到继承中的覆写问题。 继承中的覆写 从上面的经验可以得到 Python的多继承,但有以下几点需要注意: 1. 继承方法的调用和基类声明顺序有关(最先使用的覆写之后的方法)。 2. 基类init、del ,如果希望都使用,请显示的调用,否则很容易出错。 class StudentA: def __init__(self): print 'init-b' class Student: def __init__(self): print 'init-a' class MiniStudent(Student,StudentA): def __init__(self): StudentA.__init__(self) Student.__init__(self) #实例 mini = MiniStudent() |