python接口和抽象类的区别,接口和抽象类的区别
内容(1)python如何定义抽象类和抽象方法(2)python中的多态性(3)类的组合
(python如何定义抽象类和抽象方法
在python中,类继承metaclass = ABCmeta类来创建抽象类,抽象类是包含抽象方法的类,ABCmeta(定义ABS Tact基类的元类)是所有抽象类的基类。
定义抽象类后,使用@abc.abstractmethod在要实现的抽象方法前一行定义抽象方法。抽象方法不包含任何可实现的代码,只有抽象函数的代码可以在子类中实现。
抽象类的特点:
抽象类不能被实例化。继承抽象类的类必须先实现所有抽象方法,然后才能被实例化。抽象类中有抽象方法和正规方法。成员属性注意:可以添加到抽象类中。
抽象类中的抽象方法,必须在子类中实现。
抽象类不能被实例化。
在创建抽象方法之前,必须先创建一个抽象类。
需要导入abc(abstractclass)类。
Python是动态语言(程序运行时检查类型,对比:java是静态语言,程序运行前检查类型)。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用;
也就是比如传递给函数who_am_i(x)的参数x不一定是Person或者Person的子类型。任何数据类型的实例都可以,只要它有whoAmI()方法并且参数正确。
# coding:utf-8 from ABC import ABC meta,abstractmethodclass Person(object):_ _ meta _ class _ _=ABC meta def _ _ init _ _(self,* * kwargs):self . age=kwargs . get( age )self . name=kwargs . get( name )def hello(self):打印您好,我叫{},年龄{} 。format(self.name,self . age)@ abstract method def say(self):pass class Student(Person):def _ _ init _ _(self,**kwargs): super(Student,self)。_ _ init _ _(* kwargs)self . School=kwargs . get( School )def say(self):print 我的学校是,self.schoolstu=Student(姓名=王铭,年龄=19,学校=河南理工大学)stu.hello () stu.say()运行结果:
大家好,我叫王铭,年龄19岁我的学校是河南礼貌CNIC大学(二)python中的多态子类可以继承父类的方法或属性。
子类也可以覆盖父类的方法或属性。当覆盖父类的方法时,子类可以改变函数的参数、方法体和输出内容。
对象调用方法时,总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
因为Python是动态语言,所以传递给函数who_am_i(x)的参数x不一定是Person或Person的子类型。任何数据类型的实例都可以,只要它有whoAmI()方法
类有继承关系,子类类型可以向上转型看做父类类型,如果我们从Person派生Student和Teacher,并且都写了一个whoAmI()方法:
class Person(object):def init(self,name,gender):self . name=name self . gender=gender def whoAmI(self):return 我是人,我叫% s % self . name class Student(Person):def init(self,name,gender,score): super(Student,self)。init(姓名,性别)self . score=score def whoAmI(self):return 我是学生,我叫%s % self.nameclass老师(人):def init(自我,姓名,性别,课程):super(老师,自我)。init (name,gender) #继承父类的初始化函数_ _ init _ () # person.init (self,name,Gender) #效果同上self . courcedf whoami(self):return 我是老师,我叫% s% self.name #在一个函数中,如果我们收到一个变量x,那么无论x是人,学生还是老师, 结果可以正确打印出来:def who _ am _ I(x):print x . whoami()p=person( jqdxlb , male) s=student (bob , male ,88)t=Teacher(惊吓绿草,女, English )who _ am _ I(p)who _ am _ I(s)who _ am _ I(t)运行结果:
我是一个人,我的名字叫jqdxlb
我是一名学生,我的名字叫鲍勃
我是一名老师,我的名字叫害怕绿草。
这种行为被称为多态性。
即方法调用将作用于X. S Student类型的实际类型,该类型实际上有自己的whoAmI()方法和从Person继承的whoAmI方法,但调用s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
因为Python是动态语言,所以传递给函数who_am_i(x)的参数x不一定是Person或Person的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()方法:
类别簿(对象):
def whoAmI(self):
返回“我是一本书”
这是动态语言和静态语言(比如Java)最大的区别之一。该语言动态调用实例方法,而不检查类型。只要方法存在,参数正确,就可以调用。
(三)类别1的组合。班级组合2。手机、电子邮件、QQ等。可以更改(一起定义),不能更改名称(单独定义)。3.在另一个类中引用 class Info(object):def _ _ init _ _(self,phone,email,QQ):self . phone=phone self . email=email self . QQ=QQ def get _ phone(self):return self . phone def update _ phone(self,new phone):self . phone=Newphone printu 手机号码已更改 def get _ email(self):return self . email类addr book(object): docstring for AddBook def _ _ init _ _(self,name,phone,qq): self.name=name
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。