本文结构:
现在有一个Person类,它有一个属性age,有一个run方法,可以打印信息,我们希望定义一个Boy和Girl类来继承Person的属性和方法。
class Person():
def __init__(self,age):
self.age = age
def run(self):
print("i am a person,i am %d years old"%self.age)
class Boy(Person):
pass
class Girl(Person):
pass
xiaoming = Boy(16)
xiaoli = Girl(15)
xiaoming.run()
xiaoli.run()
输出结果
i am a person,i am 16 years old
i am a person,i am 15 years old ####这说明Boy类和Girl类都继承了Person的方法和属性
还是上面的那个例子,但我们想给Gril类和Boy类定义一个run的新方法。
class Boy(Person):
def run(self):
print("i am a boy,i am %d years old"%self.age)
class Girl(Person):
def run(self):
print("i am a gril,i am %d years old"%self.age)
xiaoming = Boy(16)
xiaoli = Girl(15)
xiaoming.run()
xiaoli.run()
输出结果
i am a boy,i am 16 years old
i am a gril,i am 15 years old
从输出结果可以看出虽然调用的方法没变,但打印出来的信息发生了改变,说明子类的同名(run)方法会覆盖父类的(run)方法。
其实我们定义的Person类和python的dict类、list类在原理上是相同的。
判断一个变量是否是某个类型可以用isinstance()判断:
还是上面的的例子,请大家仔细理解下
>>> a = [1,2,3]
>>> isinstance(a, list)
True
>>> isinstance(xiaoming, Person)
True
>>> isinstance(xiaoming, Boy)
True
这说明xiaoming 既是Boy类又是Person类,这个时候就可以和多态的概念联系上了。
子类继承了父类的属性,又拥有自己的属性,这就叫多态。
所以我们在定义类的时候可以充分利用这两种性质,将父类拥有的属性和方法和子类的特有属性和方法区分开,增加代码的可读性。