Python基础之封装单继承
目录
- 一、封装
- 1.1、封装含义
- 1.2、封装类
- 1.3、类中定义私有
- 1.4、封装意义
- 二、单继承
- 2.1、定义
- 2.2、单继承
- 2.4、继承的传递
- 三、方法的重写
- 3.1、概念
- 3.2、分类
- 3.3、覆盖父类方法
- 3.4、对父类方法扩展
- 实现方式
一、封装
面向对象三大特征:
- 封装:根据特征以及功能,将属性和方法封装到一个抽象的类中
- 继承:实现代码的重用,相同的代码不需要重复编写
- 多态:不同的对象调用相同的方法,产生不同的执行结果,能够增加代码的灵活度
1.1、封装含义
将复杂的信息、流程给包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现功能。
1.2、封装类
类本质上就是一种封装:
- 将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
class Washier:def __init__(self): # 构造函数self.width = 450 # 实例属性self.height = 800def dewatering(self): # 实例方法:脱水print("执行脱水!")def poaching(self): # 实例方法:漂洗print("执行漂洗操作!")wa = Washier() # 实例化对象
wa.dewatering() # 通过对象调用实例方法
定义一个Person类,类中有实例属性:姓名,年龄,实例方法:吃饭
class Person:def __init__(self, name, age):self.name = name # 实例属性self.age = agedef eat_food(self): # 实例方法print(self.name + "正在吃饭!")p = Person("PP", 23) # 实例化对象
p.eat_food() # 调用实例方法
print(p.name) # 访问实例属性
1.3、类中定义私有
私有:即类独有的,一般情况下不会去外面使用。
在Python中没有专门的修饰符用于定义属性/方法的私有,如果该属性/方法不希望在类对象外部被访问,前面使用两个下划线__。
Python中,并没有真正意义的私有,在给属性、方法命名时,实际是对名称做了一些特殊处理,使的外界无法访问到。
class Person:def __init__(self, name, age):self.name = name # 实例属性self.__age = age # 不希望在类的外部被使用,所以加了两个__,只允许在类的内部使用def say_hello(self):print("Hello World!")def tell_age(self):print(f"姓名:{self.name},年龄{self.__age}")p = Person("小菜鸡", 10)
print(p.name)
# print(p.age) 报错Person对象里面没有age这个属性
# print(p.__age) 报错
p.tell_age() # 在类中定义方法使用
print(dir(p))
print(p._Person__age) # 能访问到
p._Person__age = '25' # 能修改,没有特殊需求不要这么做
1.4、封装意义
- 将属性和方法放到一起作为一个整体,然后通过实例化对象来处理;
- 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
- 对类的属性和方法增加访问权限
二、单继承
2.1、定义
概念:Python中的继承指的是多个类之间的所属关系,即让类和类之间转变为父子关系,子类默认继承父类的所有属性和方法。
作用:实现代码的重用,相同的代码不需要重复的编写,提高开发效率。
语法
class 类名(父类名):"""类的描述信息"""实体
分类:
- 单继承:只有一个父类
- 多继承:有多个父类
有多个父类的时候,类名之间用","分割,如果不写父类,默认继承object(顶级父类)。
2.2、单继承
class Person:"""人类:父类"""age = 18 # 类属性def eat(self): # 实例方法print("我会干饭")def sleep(self):print("干完饭了就睡觉")class Man(Person):"""男人类,子类"""pass # 占位符,代码里面不写东西,会自动跳过man = Man()
print(Man.age) # 访问类属性,既能通过类名访问,
print(man.age) # 也能通过对象访问
man.eat() # 调用实例方法
man.sleep()
总结:继承可以使用子类拥有父类的属性和方法
2.4、继承的传递
C类继承于B类,B类继承A类,C类具有A、B的属性和方法。
class A1:"""A1类:A2的父类"""thing = "传家宝"def skill(self):print("祖传好手艺")class A2(A1):"""A2类:A1的子类,A3的父类"""pass
# 实例化A2对象
a2 = A2()
print(a2.thing) # 传家宝
a2.skill() # 祖传好手艺class A3(A2):"""A3类:A2的子类"""pass
# 实例化A3类对象
a3 = A3()
print(a3.thing) # 传家宝
a3.skill() # 祖传好手艺
总结:继承的传递性就是子类拥有父类以及父类的父类的属性和方法。
三、方法的重写
3.1、概念
重写是指在子类中修改或扩张父类中的方法。
3.2、分类
- 覆盖父类方法
- 对父类方法进行扩展
class Person:"""人类:父类"""age = 18 # 类属性def eat(self): # 实例方法print("我会干饭")def sleep(self):print("干完饭了就睡觉")class Man(Person):"""男人类,子类"""pass # 占位符,代码里面不写东西,会自动跳过man = Man()
print(Man.age) # 访问类属性,既能通过类名访问,
print(man.age) # 也能通过对象访问
man.eat() # 调用实例方法
man.sleep()
3.3、覆盖父类方法
在子类中定义一个跟父类同名的方法,会调用子类重写的方法。
class Parent:"""Parent类:父亲"""def connect(self):print("打电话联系!")class Child(Parent):"""Child类:子类"""passchild = Child()
child.connect() # 打电话联系。(子类中没有定义connect方法,使用父类中的connect方法。)
重新子类方法:
class Parent:"""Parent类:父亲"""def connect(self):print("打电话联系!")class Child(Parent):"""Child类:子类"""def connect(self):print("科技发展,打个视频电话!")child = Child()
child.connect() # 科技发展,打个视频电话!
3.4、对父类方法扩展
继承父类的方法,子类可以增加自己的功能
实现方式
- 父类名.方法名(self)
- super().方法名() ——推荐使用
- super(子类名,self).方法名()
class Parent:"""Parent类:父类"""def connect(self):print("打电话联系。")class Child(Parent):"""Child类:子类"""def connect(self):# 1.父类名.方法名(self)# Parent.connect(self)# 2.super().方法名() ---推荐使用super().connect()# 3.super(子类名, self).方法名() ---过时# super(Child, self).connect()print("社会发展了,可以直接视频联系了。")
child = Child()
child.connect()
# 打电话联系。
# 社会发展了,可以直接视频联系了。(既拥有了父类的功能,又扩展了新功能)