#conding: utf-8
'''
多态的两大要素
1. 继承
2. 方法重写
'''
class Programer(object): #定义了一个Programer类
hobby = "Play Computer" #在类里面直接定义一个属性hobby
def __init__(self, name, age, weight): #在构造函数里面定义了三个属性
self.name = name
self._age = age
self.__weight = weight
@classmethod #方法的装饰器;调用的时候直接用类名,而不是某个对象
def get_hobby(cls):
return cls.hobby
@property #方法的装饰器;像访问属性一样调用方法
def get_weight(self):
return self.__weight
def self_introduction(self):
print('My name is %s \nI am %s years old\n' % (self.name, self._age))
#类的继承
class BackendProgramer(Programer): #定义一个BackendProgramer类,继承了Programer类
#对构造函数进行了修改,多出一个language属性,使用super调用了BackendProgramer父类的构造函数,将language属性进行了赋值
def __init__(self,name, age, weight, language): #构造函数多出一个language属性
super(BackendProgramer, self).__init__(name, age, weight) #使用super调用了BackendProgramer父类的构造函数
self.language = language #将language属性进行了赋值
def self_introduction(self): #重写父类里self_introduction这个方法,将输出稍微做了修改
print('My name is %s \nMy favorite language is %s' % (self.name, self.language))
def introduce(programer): #定义了一个introduce函数
if isinstance(programer, Programer): #判断传进来的这个参数是不是属于Programer这个对象
programer.self_introduction() #如果判断是Programer这个对象,就直接调用这个对象的self_introduction方法
'''
因为多态的特性,使得在添加功能的时候非常简单。
只要判断一下它是不是属于它的父类,就可以不管它具体传进来的是哪个子类,就可以去调用这个方法
'''
if __name__ == '__main__':
programer = Programer('Jodie', 25, 80) #将Programer这个类进行实例化
backend_programer = BackendProgramer('RJ', 18, 90, 'Python') #将BackendProgramer这个类进行实例化
introduce(programer) #用introduce这个函数来调用self_introduction方法
introduce(backend_programer) #用introduce这个函数来调用self_introduction方法
-------------------------------
运行后的打印结果:
D:\Jodie2019\venv\Scripts\python.exe D:/Jodie2019/study/study7类的多态.py
My name is Jodie
I am 25 years old
My name is RJ
My favorite language is Python
Process finished with exit code 0