快速学习python面向对象(二)封装、继承、多态

Annypst 2025.1.31
概要:

图源:黑马程序员
关键词:封装 私有成员的使用 单继承 多继承 父类 类型注解 复写 多态
封装
程序中不对用户开放的内容封装起来。Python中 __ 开头表示私有。
class car:
# 车的序列号
sn="001"
# 车的颜色
color="blue"
# 私有属性,车的日期
__date="2025.1.30"
# 私有方法,打印当前驾驶日期
def __the_current_drive(self):
print("2024.12.31")
这些私有方法就不可以再底下被调用。
但是它们可以在自己的类中被使用。
class car:
# 车的序列号
sn="001"
# 车的颜色
color="blue"
# 私有属性,车的日期
__date="2025.1.30"
__people_in_car=3
# 私有方法,打印当前驾驶日期
def __the_current_drive(self):
print("2024.12.31")
# 检查车中的人数是否达到或超过5人
def check_people_in_car(self):
if self.__people_in_car>=5:
print("ok!")
else:
print("no!")
car1= car()
car1.check_people_in_car()
检查车内人数是否多于5人
结果 no!
继承
定义新的类,但是里面有一些已经写过的类的功能,这个时候就不用重写了,只需要继承以前类中的某些功能就行。
# class car:
# 车的序列号
sn="001"
# 车的颜色
color="blue"
# 私有属性,车的日期
__date="2025.1.30"
__people_in_car=3
# 私有方法,打印当前驾驶日期
def __the_current_drive(self):
print("2024.12.31")
# 检查车中的人数是否达到或超过5人
def check_people_in_car(self):
if self.__people_in_car>=5:
print("ok!")
else:
print("no!")
# car_v_2类继承自car类,扩展了car类的功能
class car_v_2(car):
sn_new="2025_new_car" # 新功能
如上代码,括号里写想要继承的父类,这样就可以继承car中的功能。car_v_2称作子类。
多继承:
如果需要继承好几个类,就可以这样写:
class 类名 (父类1,父类2.........):
内容
pass关键字,可以用来补全语法,例如我这个类已经继承了很多内容,不需要新写,那么就用pass补全哦。
class 类名 (父类1,父类2.........):
pass
注意:
多继承中,如果有同名成员,默认以从左到右为优先级,先继承的保留,后继承的覆盖。(顶端优势)
复写父类成员
如果继承了父类,但对其原有功能不满意,就可以在子类复写。
方法:直接在子类重新定义属性或者方法即可。
# class car:
# 车的序列号
sn="001"
# 车的颜色
color="blue"
# 私有属性,车的日期
__date="2025.1.30"
__people_in_car=3
# 私有方法,打印当前驾驶日期
def __the_current_drive(self):
print("2024.12.31")
# 检查车中的人数是否达到或超过5人
def check_people_in_car(self):
if self.__people_in_car>=5:
print("ok!")
else:
print("no!")
# ————————————————————————————————————————
# car_v_2类继承自car类,扩展了car类的功能
class car_v_2(car):
color="red" #复写了颜色是red
sn_new="2025_new_car" # 新功能
调用父类同名成员
如果复写完成,但还想调用原来的父类成员,方法如下:
-
父类名.成员变量 父类名.成员方法(self)
-
super().成员变量 super().成员方法()
class phone:
call_mode="4g"
version=1.0
def show_battery(self):
# 显示旧手机的电池容量
battery="4000mah"
return f"以前的电池容量是{battery}"
class new_phone(phone):
call_mode="5g"
version=2.0
def show_battery(self):
# 显示新手机的电池容量
battery="5000mah"
return f"现在的电池容量是{battery}"
def show_version(self):
# 打印父类的版本号
print(f"以前父类的版本是{phone.version}")
# 或者
print(f"以前父类的版本是{super().version}")
my_phone1=new_phone()
my_phone1.show_version()
结果: 以前父类的版本是1.0
类型注解

调用方法时,这个框里弹出的提示就是类型注解,类似于对函数形参的解释。
变量:类型
name:str="Steve"
number:int=12345
对于类:
class car:
color="blue"
car1:car=car()
对于容器:
my_list:list=[1,2,3]
或者泛型:
my_tuple:tuple[int,str,bool]=(1,"hello",True)
或:
name="Steve" # type:str
number=12345 # type:int
对于函数形参:
def add(a:int,b:int):
return a+b
a=input()
b=input()
print(add(int(a),int(b)))
这样:

对于返回值的注解:
def add(a:int,b:int)->int:
return a+b
这样:

对于Union联合类型注解:
my_list=[1,"hello",True]
对于混合形式
from typing import Union
my_list:list[Union[str,int,bool]]=[1,"hello",True,111]
Union对于上面提到的其他类型的注解仍然可以使用。
多态
指的是多种状态,使用不同对象会获得不同状态。例如,同样对于动物这个类,对象是狗,状态是狗叫,如果是猫,则是猫叫。
class Anm:
def speak(self):
pass
class Dog(Anm):
def speak(self):
print("汪!")
class Cat(Anm):
def speak(self):
print("nya~")
dog=Dog()
cat=Cat()
dog.speak()
cat.speak()
结果:
汪!
nya~
就是父类决定有哪些方法,具体的实现有子类决定,父类就相当于是一个字典表。就相当于国家规定空调具有某些功能,怎么实现它们是每个厂家自己的事情。
事实上,这种写法成为抽象类,也叫接口。
pass的方法称为抽象方法。
end.
2028

被折叠的 条评论
为什么被折叠?



