当前位置: 首页 > 后端技术 > Python

Python:面向对象的三大特性(封装、继承、多态)

时间:2023-03-26 19:07:36 Python

面向对象的三大特性:特性简述封装提高程序安全性继承提高代码复用性多态性提高程序扩展性和可维护性封装:包装数据(属性)和行为(方法)转化为类对象。在方法内部操作其属性,在类对象外部调用方法。这样就不需要关注内部方法的实现细节,隔离了复杂度。在Python中,私有属性没有特殊的修饰符。如果属性不想在类对象之外被访问,在属性名前加两个“_”。classStudent:def__init__(self,name,age):self.name=nameself.__age=age#隐藏属性defget_age(self):print(self.__age)stu=Student('Alen',20)stu.get_age()#20#print(stu.__age)#AttributeError:'Student'objecthasnoattribute'__age'print(stu._Student__age)#20、可以获取特殊方法,不推荐继承语法:classsubclassclassname(Parent1,Parent2...):如果一个类没有继承任何类,则默认继承object。Python支持多重继承。定义子类时,必须在其构造函数中调用父类的构造函数。代码示例:classPerson:def__init__(self,name,age):self.name=nameself.age=agedefinfo(self):print(self.name,self.age)classStudent(Person):def__init__(self,name,age,score):super().__init__(name,age)self.score=scoreclass老师(Person):def__init__(self,name,age,job_title):super().__init__(name,age)self.job_title=job_titlestu1=Student('张三',15,55)stu1.info()#张三15tec1=Teacher('李老师',42,'班主任')tec1.info()#李老师42当方法重写了父类的某个属性或者方法不满足子类的要求时,子类可以在自己的方法体中重写。在子类重写的方法中,可以通过super().parent方法名()调用父类中重写的方法。代码示例:classPerson:def__init__(self,name,age):self.name=nameself.age=agedefinfo(self):print('name:',self.name,',age:',self.age)classStudent(Person):def__init__(self,name,age,score):super().__init__(name,age)self.score=scoredefinfo(self):#重写信息方法super().info()#调用父类的方法print('Grade:',self.score)stu1=Student('张三',15,55)stu1.info()#姓名:张三,年龄:15分数:55objectclass对象类是所有类的父类,所以所有的类都有对象类的属性和方法。内置函数dir()可以查看对象的所有属性。object有一个__str__()方法,用来返回“对象的描述”,对应内置函数str(),在print()方法中经常用到,帮助我们查看对象。信息,所以__str__()经常被改写classStudent:def__init__(self,name,age,score):self.score=scoreself.name=nameself.age=agedef__str__(self):#objectreturn'name:'+self.name+',age:'+self.age+',grade:'+self.scorestu1=Student('张三','15','55')print(dir(stu1))#查看对象的所有属性,继承自对象类#['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__',#'__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__',#'__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','age','name','score']print(stu1)#默认调用__str__()方法;输出:姓名:张三,年龄:15,年级:55,而方法在运行过程中,根据变量引用的对象的类型,动态决定调用对象中的哪个方法。classAnimal:defeat(self):print('animaleats')classDog(Animal):defeat(self):#覆盖父类方法print('dogeatsbones')classCat(Animal):defeat(self):#覆盖父类方法print('cateatsfish')classHuman:defeat(self):print('Peopleeatallkindsoffood')deffun(a):a.eat()fun(Animal())#动物吃fun(Dog())#狗吃骨头fun(Cat())#猫吃鱼fun(Human())#人吃各种食物关于多态性的静态语言和动态语言的区别就是Python是动态语言,Java是静态语言。静态语言多态的三个必要条件:继承方法将父类引用重写为子类对象动态语言多态:不关心对象的类型,只关心对象的行为。有指定的行为要执行。