一、魔术方法
魔术方法为我们提供了一种定制和控制对象行为的灵活方式,使得代码更具可读性、可维护性和可扩展性。
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.单继承
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.总结
- 什么是继承?
继承就是一个类,继承另外一个类的成员变量和成员方法
子类构建的类对象,可以- 有自己的成员变量和成员方法
- 使用父类的成员变量和成员方法
- 单继承和多继承
单继承:一个类继承另一个类
多继承:一个类继承多个类,按照顺序从左向右依次继承
多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承
- pass关键字的作用是什么
pass是占位符,函数(方法)或类定义的完整性,表示无内容,空的意思。
if 1 == 1:
print(True)
else:
pass