初识对象
使用对象数据
1.在程序中设计表格,设计类(class)
class Student :
name = None #记录学生姓名
2.在程序中打印生产表格,创建对象
# 基于类创建对象
stu_1.name = Student()
stu_2.name = Student()
3.在程序中填写表格,对象属性赋值
stu_1.name ="h" #为学生1对象赋予名称属性值
stu_1.name =w" #为学生2对象赋予名称属性值
使用对象数据
# 设计一个类(类比生活中:设计一张登记表)
class Student:
name = None
gender = None
nationality = None
native_place = None
age = None
# 创建一个对象(类比生活中:打印一张登记表)
stu_1 = Student()
# 对象属性进行复制
stu_1 .name = "h"
stu_1 .age = 17
stu_1 .native_place = "dz"
stu_1 .gender = "男"
stu_1 .nationality = "China"
# 获取对象中记录的信息
print(stu_1.name)
print(stu_1.age)
print(stu_1.gender)
print(stu_1.nationality)
print(stu_1.native_place)
类的成员方法
类的定义和使用
成员变量和成员方法
类中
●可以定义属性用来记录数据
●也可以定义函数,用来记录数据
其中
●定义的属性(变量):成员变量
●定义的行为(函数):成员方法
注意事项
类和对象
使用类和对象描述现实事务
类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作。
在程序中通过类来描述
基于类创建对象
面向对象编程
设计类,基于类创建对象,由对象做具体的工作
构造方法
属性(成员变量)的赋值
通过传参的形式对属性赋值使用构造方法 __init__()
构造方法
属性(成员变量)的赋值
通过传参的形式对属性赋值使用构造方法 __init__()
构造方法
python类 :__init__()
可以实现
●在创建类对象(构造类)的时候,会自动执行
●在创建类对象(构造类)的时候,将传入参数自动传递给 __init__()方法使用
class Student:
name = None
age = None
def __init__(self,name,age):
self.name =name
self.age = age print(name,age)
stu = Student ("w","l")
成员方法可以不写
通过这个语句(self.name self.age)赋值,成员变量就存在了(赋值又定义)
# 正确调用__init__方法,传递了name和age参数
构造方法注意事项
内置方法(魔术方法)
__str__字符串方法
# __str__字符串方法
class Student():
# 这里定义的name和age是类变量,而不是实例变量。
# 通常情况下,我们不会在类级别直接定义实例的属性,除非有特别的需求(如默认值)。
name = None
age = None
# 初始化方法,当创建类的新实例时自动调用
def __init__(self, name, age):
# 使用self关键字来引用实例本身,并为其实例变量赋值
self.name = name
self.age = age
# 定义一个特殊方法,用于返回对象的字符串表示形式
def __str__(self):
# 使用f-string格式化字符串,返回学生的名字和年龄
return f"{self.name},{self.age}"
# 创建一个Student类的实例s,并传入名字"w"和年龄3
s = Student("w", 3)
# 调用print函数时,会隐式地调用对象的__str__方法
# 因此,这里会打印出s对象的字符串表示形式,即"w,3"
print(s)
__it__小于符号比较方法
class Student():
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self,other):
return self.age < other.age # <运算符并且得到正确的结果
s1 = Student ("w" , 11)
s2 = Student ("y" , 21)
print(s1 >s2)
__le__小于等于比较符号
class Student():
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self,other):
return self.age <= other.age # <=运算符并且得到正确的结果
stt = Student ("w",4)
ste = Student ("h",4)
print(stt>=ste)
__eq__比较运算符实现方法
class Student():
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self,other):
return self.age <= other.age # <=运算符并且得到正确的结果
stt = Student ("w",4)
ste = Student ("h",4)
print(stt>=ste)
封装
面向对象编程: 基于模板(类)去创建实体(对象),使用对象完成功能开发
面向对象三大特性:封装,继承,多态
私有成员
类中提供了私有成员的形式来支持
●私有成员变量
●私有成员方法
定义私有成员的方式
●私有成员变量:变量名以__开头(2个下划线)
●私有成员方法:方法名以__开头(2个下划线)
类对象无法访问私有成员
类中其他成员可以访问私有成员
私有成员(内部)
类对象(外部)eg人民无法访问国家机密
私有成员意义:在类中仅供内部使用的属性和方法,而不对外开放(类对象无法使用)
使用私有成员
class Student():
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self,other):
return self.age == other.age
sr = Student ("w",4)
se = Student ("h",5)
print(sr == se)
继承
基础语法
class 子类名(父类名):
类内容体
继承分为:单继承和多继承
继承表示:将父类 那里继承(复制)来成员变量和成员方法(不含私有)
多继承:python的类之间也支持多继承,即一个类,可以继承多个父类
class 子类名(父类1,父类2,父类3,.....,父类n):
类内容体
多继承:一个类继承多个类。按照顺序从左到右依次继承(优先级从左到右依次降低)
多继承中如果父类有同名方法或属性,先集成的优先级高于后继承
pass关键字:pass是占位符,保证函数或者方法或者说类定义的完整性,表示无内容,空的意思
# 定义一个基类Phone,包含IMEI(未初始化)、producer属性和一个方法call_by_4g
class Phone:
IMEI = None
producer = "HH"
def call_by_4g(self):
print("4g")
# 定义一个从Phone类继承的子类phone2022,添加了一个face_id属性和一个方法call_by_5g
class phone2022(Phone):
face_id = "10001"
def call_by_5g(self):
print("2022年新功能,5g通话")
# 创建phone2022类的实例p,并调用其方法
p = phone2022()
print(p.producer) # 输出:"HH",继承自基类Phone
p.call_by_4g() # 输出:"4g",继承自基类Phone
p.call_by_5g() # 输出:"2022年新功能,5g通话"
# 多继承
class NFCReader:
nfc_type = "第五代"
producer = "HM" # 这里也定义了一个producer属性
def read_card(self):
print("NFC读卡")
def write_card(self):
print("NFC写卡")
class RemoteControl:
rc_type = "红外遥控"
def control(self):
print("红外遥控开启了")
# 定义一个从Phone、NFCReader和RemoteControl类继承的子类Myphone
class Myphone(Phone, NFCReader, RemoteControl):
pass
# 创建Myphone类的实例ph,并调用其方法
ph = Myphone()
ph.call_by_4g() # 输出:"4g",继承自基类Phone
ph.control() # 输出:"红外遥控开启了",继承自RemoteControl
ph.read_card() # 输出:"NFC读卡",继承自NFCReader
ph.write_card() # 输出:"NFC写卡",继承自NFCReader
复写
# 定义一个基类 Phone
class Phone:
# IMEI 是一个类变量,目前被设置为 None
IMEI = None
# produser 是一个类变量,表示生产厂商,被设置为 "ITCAST"
produser = "ITCAST"
# 定义一个方法 call_by_5g,该方法在被调用时打印一条消息
def call_by_5g(self):
print("使用5g网络进行通话")
# 定义一个从 Phone 类继承的子类 Myphone
class Myphone(Phone):
# Myphone 类重写了 produser 类变量,将其设置为 "ITHEIMA"
produser = "ITHEIMA"
# Myphone 类重写了 call_by_5g 方法,该方法在被调用时打印多条消息
def call_by_5g(self):
print("开启CPU单核模式,确保通话的时候省电")
print("使用5g网络进行通话")
print("关闭CPU单核模式,确保性能")
# 创建一个 Myphone 类的实例 ph
ph = Myphone()
# 打印 ph 实例的 produser 属性,由于 Myphone 类重写了该属性,所以将输出 "ITHEIMA"
print(ph.produser)
# 调用 ph 实例的 call_by_5g 方法,由于 Myphone 类重写了该方法,所以将执行 Myphone 类中的 call_by_5g 方法
ph.call_by_5g()
class Phone:
IMEI = None
produser = "ITCAST" #没有丢失,可以使用
def call_by_5g(self):
print("使用5g网络进行通话")
调用父类同名成员
# 接着定义子类Myphone,它继承自Phone类
class Myphone(Phone):
produser = "ITHEIMA"
def call_by_5g(self):
print("开启CPU单核模式,确保通话的时候省电")
# 方法1:直接通过父类名调用父类的方法
# 注意:这里我们调用了Phone类中的call_by_5g方法
Phone.call_by_5g(self)
# 方法2:使用super()调用父类的属性和方法
# 首先,我们打印了父类中的produser属性值
print(f"父类的厂商是:{super().produser}")
# 接着,我们调用了父类中的call_by_5g方法
super().call_by_5g()
print("关闭CPU单核模式,确保性能")
# 创建Myphone类的实例
ph = Myphone()
# 打印Myphone实例的produser属性,将输出"ITHEIMA",因为子类重写了这个属性
print(ph.produser)
# 调用Myphone实例的call_by_5g方法,将执行Myphone类中的call_by_5g方法
ph.call_by_5g()
类型注解
在代码中涉及数据交互的地方,提供数据类型的注解(显示说明)
- 主要功能:帮助第三方IDE工具(如PyCharm)对代码进行类型推断协助做代码提示
- 帮助开发者自身对变量进行类型注释
支持
- 变量的类型注解
- 函数(方法)形参列表和返回值的类型注解
变量类型的注解
注意事项
类型注释只是提示性,并非决定性的。数据类型和注释类型无法对应也不会导致错误
# 基础数据类型注解
var_1: int = 10
var_2: str = "w"
var_3: bool = True
# 类对象类型注解
class Student():
pass
stu: Student =Student ()
# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1,2,3)
my_dict: dict = {"s": 9}
# 容器详细类型注解
my_list1: list[int] =[1,2,3]
my_tuple1: tuple[int, str, bool] = (1, "2", True)
my_dict1: dict[str, int] = {"s": 9}
print(my_tuple1)
var_4 = 10 # type: int
var_5 = "10" # type: str
var_6 = True # type: bool
方法类型注解
对形参做的类型注解,写代码会自动的进行代码补全的提示
Union联合类型注解
- 使用Union[类型,.....,类型]
- 可以定义联合类型注释
多态
同样的行为(函数),传入不同的对象,得到不同的状态
抽象类
class AC:
def cool_wind(self):
"""制冷"""
pass
def hot_wind(self): # 修正了方法名的大小写,使其与类Midea_AC和GREE_AC中的方法名一致
"""制热"""
pass
def swing_l_r(self):
"""左右摆风"""
pass
class Midea_AC(AC):
def cool_wind(self):
print("美的空调核心制冷科技")
def hot_wind(self): # 修正了方法名的大小写
print("美的空调电热丝加热")
def swing_l_r(self):
print("美的空调无风感左右摆风")
class GREE_AC(AC):
def cool_wind(self):
print("格力空调变频省电制冷")
def hot_wind(self): # 修正了方法名的大小写
print("格力空调电热丝加热")
def swing_l_r(self):
print("格力空调静音左右摆风")
def make_cool(ac: AC): # 移除了 self 参数
ac.cool_wind()
midea_ac = Midea_AC()
gree_ac = GREE_AC() # 调用构造函数创建实例
make_cool(midea_ac)
make_cool(gree_ac)