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

快速学习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" # 新功能

调用父类同名成员

如果复写完成,但还想调用原来的父类成员,方法如下:

  1. 父类名.成员变量 父类名.成员方法(self)

  2. 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值