python小结----面向对象的三大特征(封装,继承,多态)
面向对象的三大特征: 封装,继承,多态
面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴
封装
什么是封装:
在面向对象编程的思想中,对代码进行高度封装,封装又叫包装
封装就是指将数据或者函数等客观的事物封装在在一个个的单元中,我们称之为类, 被封装的对象通常被称为抽象数据类型
简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体
封装的原则隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别
封装在编程中的核心作用:
1.整体化代码,减少代码的冗余
2.便于携带,每次需要用到封装的方法时可以直接对方法进行调用
3.提高数据或算法的安全性,可以保护代码被有意或无意的修改
继承
继承指的是描述多个类之间的一个所属关系
单继承:一个类只继承了一个父类 如果类继承了父类,子类就继承了父类的属性和方法
如果多个父类的方法名相同
子类会继承第一个父类的这个方法 通过一个类创建成功后,必须执行一次这个同名方法(可能是自己的,也可能是父类的)
如果子类中没有这个同名方法,会继承第一个父类中的这个同名方法
如果子类中有这个同名方法,则会继承子类中的这个同名方法,父类中的这个同名方法都不继承
多继承:子类如果继承了多个父类,子类就会继承父类多个不同名的属性和方法
如果多个父类的方法名称均不同,子类会全部继承
如果多个父类的方法名称均相同,子类会继承第一个父类的
如何决定继承那个父类的方法
如果子类也有父类的同名方法,那么子类就会选择自己的方法
如果子类中也有同名的方法,所有父类的同名方法都不会继承
通过一个类创建一个对象,必须执行一次init方法,找init方法的顺序要遵循继承链( 类名.mro)
多层继承和多继承是同一个原理包括调用父类中的同名方法包括super的使用都是一样的原理
重写
重写: 是指在子类中重新去写父类中已经有的方法,并且在子类中保持这方法名不变,只有方法体发生改变
方法一:
- 子类继承了父类,父类不能满足子类的需求。子类重写父类的同名方法
- 但是子类还想在其类内部使用父类的同名方法方法一:
父类名.父类的同名方法(self)
**方法二:**super函数是用来获取指定的子类在继承链中的后一个类给当前子类的self
super(子类名,self).父类同名方法
一般情况下获取当前子类的直接父类的同名方法可以省略括号中的参数
super().父类同名方法
class shifu1(object):
def __init__(self):
self.name = "小明"
class shifu2(object):
def __init__(self):
self.age = 18
class tudi(shifu1, shifu2):
def __init__(self):
shifu1.__init__(self)
shifu2.__init__(self)
a = tudi()
print("我叫%s,我今年%d!" % (a.name, a.age))
多态
概念: 不同类的对象调用相同的父类的方法,产生不同的结果
特点: 1.多态可以增加代码的灵活性
2.以继承和重写方法为前提
3.是调用方法的技巧,不会影响类的原本的设计
# 创建一个人的类,这个类里面有属性:(姓名,年龄,身高等),要求人的年龄大于0小于300如果小于0则默认为0,大于300默认为300
class Person(object):
def __init__(self, name, age, height):
self.name = name
self.__age = age
self.height = height
self.set_age(age)
def set_age(self, age):
if 300 < age:
self.__age = 300
elif age < 0:
self.__age = 0
else:
self.__age = age
def get_age(self):
return self.__age
zs = Person("张三", 21, "1.78米")
# zs.set_age(500)
print("我叫%s,我今年%d岁了,我的身高是:%s!" % (zs.name, zs.get_age(), zs.height))
类成员
对象成员:指的是这个类中的成员如果要使用和访问只能通过,将类进行实例成一个对象,
然后通过对象去访问这个成员,对象成员无法通过类名直接访问,不管是方法还是属性
类成员:使用@classmethod修饰器进行修饰方法
类成员指的是这个成员在外部的访问可以通过类的名称或者该类实例的对象进行访问
静态方法
静态成员:使用@staticmethod修饰器来进行修饰方法,静态方法不需要定义参数,
可以通过类或方法进行访问,这种方法就类似于数据类型转换方法一样
例如类里面有一些功能,这个功能和实例对象其实并没有任何关系
但是需要让这个功能称为这个类的成员,可以采用静态或者类方法,访问可以直接通过类进行访问
本文地址:https://blog.csdn.net/Layfolk_XK/article/details/107644691