本文结构:
- 类的继承
- 多态
一、类的继承
- 在编写类的时候并非一定要从0开始,如果你要编写的类是某一个现成类的特殊版本,可使用继承。原有的类叫做父类,而新类叫做子类,子类会自动继承父类的所有属性和方法,同时还可以定义自己的特有属性和特有方法。
通过下面的demo来一一说明。
demo1
现在有一个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的方法和属性
- 但如果子类和父类存在同名的方法,子类的方法会覆盖父类的方法。
demo2
还是上面的那个例子,但我们想给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()判断:
demo3
还是上面的的例子,请大家仔细理解下
>>> a = [1,2,3]
>>> isinstance(a, list)
True
>>> isinstance(xiaoming, Person)
True
>>> isinstance(xiaoming, Boy)
True
这说明xiaoming 既是Boy类又是Person类,这个时候就可以和多态的概念联系上了。
子类继承了父类的属性,又拥有自己的属性,这就叫多态。
所以我们在定义类的时候可以充分利用这两种性质,将父类拥有的属性和方法和子类的特有属性和方法区分开,增加代码的可读性。