Python基础(二十六、封装、继承)

发布时间:2024年01月12日

一、魔术方法

魔术方法为我们提供了一种定制和控制对象行为的灵活方式,使得代码更具可读性、可维护性和可扩展性。

1.介绍

前后两个下划线,就代表着魔术方法。

  • __init__:构造方法,可用于创建类对象的时候设置初始化行为
  • __str__:用于实现类对象转字符串的行为
  • __lt__:用于2个类对象进行小于或大于比较
  • __le__:用于2个类对象进行小于等于或大于
  • __eq__:等于比较

2.示例

clock.py

import winsound

class Clock:

    # 构造方法
    def __init__(self, id, price):
        self.id = id
        self.price = price
    def __str__(self):
        return f"闹钟{self.id},价格是{self.price}元"

    # 魔术方法 价格比较,不带等于
    def __lt__(self, other):
        return self.price < other.price

    # 魔术方法 价格比较,带等于
    def __le__(self, other):
        return self.price <= other.price

    # 魔术方法 价格等于
    def __eq__(self, other):
        return self.price == other.price

    def ring(self):
        winsound.Beep(1000, 3000)


if __name__ == "__main__":
    clock = Clock(101, 122)
    clock1 = Clock(102, 112)
    print(clock)
    print(clock > clock1)
    clock2 = Clock(102, 112)
    print(clock2 >= clock1)
    clock.ring()

输出:

闹钟101,价格是122元
True
True
True

二、封装

1.私有成员

既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。
类中提供了私有成员的形式来支持:

  • 私有成员变量
  • 私有成员方法

定义私有成员的方式非常简单,只需要:

  • 私有成员变量:变量名以__开头 (2个下划线)
  • 私有成员方法:方法名以__开头 (2个下划线)

即可完成私有成员的设置。

2.代码示例

siyou.py

class Phone:
    # 当前电压
    __current_voltage = None
    def __init__(self, IMEI, sound):
        # 序列号
        self.IMEI = IMEI
        # 音量
        self.sound = sound
        
        if self.sound < 10:
            self.__current_voltage = 1
        else:
            self.__current_voltage = 0


    def ca11_by_5g(self):
        if self.__current_voltage:
            print("已为您开启降噪模式")
        else:
            self.__keep_single_core()
    def __keep_single_core(self):
        print("音量过大,可能会对耳朵造成伤害")

if __name__ == "__main__":
    phone = Phone(1102,2)
    phone.ca11_by_5g()

私有成员变量:__current_voltage
私有成员方法:__keep_single_core
输出:

已为您开启降噪模式

3.总结

  1. 封装的概念是指?
    将现实世界事物在类中描述为属性和方法,即为封装。
  2. 什么是私有成员?为什么需要私有成员?
    现实事物有部分属性和行为是不对使用者开放的
    同样在类中描述属性和方法的时候也需要达到这个要求,就需要定义私有成员了。
  3. 如何定义私有成员?
    成员变量和成员方法的命名均以"__"作为开头即可。
  4. 私有成员的访问限制?
    类对象无法访问私有成员。
    类中的其它成员可以访问私有成员。

三、继承

继承分为:单继承和多继承。
继承表示:将从父类那里继承(复制)成员变量和成员方法(不含私有)。

封装的优势包括:

  1. 数据隐藏和安全性:通过封装,我们可以将对象的数据隐藏在类的内部,提高数据的安全性和完整性。
  2. 简化接口:封装允许我们定义清晰、简洁的接口,使得使用对象变得更加容易,降低代码的复杂性。
  3. 实现数据封装和抽象:通过封装,我们可以将相关的数据和方法组合在一起,形成一个独立的抽象单元,提高代码的模块化程度。
  4. 代码重用和继承:通过封装数据和方法,我们可以创建可复用的类,避免重复编写相同的代码,同时通过继承封装的类,实现代码的灵活性和可扩展性。
  5. 细节隐藏和接口隔离:封装允许隐藏对象的内部实现细节,提高代码的灵活性和可维护性,同时可以实现接口隔离,使代码更加灵活和可定制。

1.单继承

class 类名(父类名):
	类内容体

2.单继承示例

jicheng.py

import siyou
class PhoneUp(siyou.Phone):
    def __init__(self, IMEI, sound, face_id):
        # 面部师表
        super().__init__(IMEI, sound)
        self.face_id = face_id

    def face(self):
        if self.face_id != None:
            print("面部识别设置成功")

if __name__ == "__main__":
	phone = PhoneUp(1102,2,22)
	phone.ca11_by_5g()
	phone.face()

输出:

已为您开启降噪模式
面部识别设置成功

3.多继承

class 类名(父类名1,父类名2,父类名3,父类名4,……):
	类内容体

4.多继承示例

jicheng.py

import siyou
from sound import clock


class PhoneUp(siyou.Phone, clock.Clock):
    def __init__(self, IMEI, sound, id, price, face_id):
        super().__init__(IMEI, sound)
        super().__init__(id, price)
        # 面部识别
        self.face_id = face_id

    def face(self):
        if self.face_id != None:
            print("面部识别设置成功")

if __name__ == "__main__":
    phone = PhoneUp(1102, 2, 1111,122,22)
    phone.ca11_by_5g()
    phone.face()
    phone.ring()

输出:

音量过大,可能会对耳朵造成伤害
面部识别设置成功

5.总结

  1. 什么是继承?
    继承就是一个类,继承另外一个类的成员变量和成员方法
    子类构建的类对象,可以
    • 有自己的成员变量和成员方法
    • 使用父类的成员变量和成员方法
  2. 单继承和多继承
    单继承:一个类继承另一个类
    多继承:一个类继承多个类,按照顺序从左向右依次继承
    多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承
  3. pass关键字的作用是什么
    pass是占位符,函数(方法)或类定义的完整性,表示无内容,空的意思。
if 1 == 1:
	print(True)
else:
	pass 
文章来源:https://blog.csdn.net/qq_35716085/article/details/135527501
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。