思考🤔?
学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生填写
改为使用登记表,打印出来让学生自行填写:
在程序中简单使用变量来记录学生信息
使用变量记录数据太乱了。
如果程序中也和生活中一样
使用对象组织数据
在程序中可以做到和生活中那这样,设计表格,生产表格和填写表格的组织形式的
1.在程序中设计表格
,我们称之为:设计类(class)
class Studen:
name = None #记录学生姓名
2.在程序中打印生产表格
,我们称之为:创建对象
# 基于类创建对象
stu1 = Student()
stu2 = Student()
3.在程序中填写表格
,我们称之为:对象属性赋值
stu_1.name = "周杰轮" # 为学生1对象赋予名称属性值
stu_2.name = "林军杰" # 为学生2对象赋予名称属性值
class 类名称 class是关键字,表示要定义类了
类的属性 类的属性,即定义在类中的变量(成员变量)
类的行为 类的行为,即定义在类中的函数(成员方法)
创建类对象的语法
对象 = 类名称()
class Student:
name = None # 学生的姓名
age = None # 学生的年龄
def say_hi(self):
print(f"Hi大家好,我是{self.name}")
stu = Student()
stu.name = "周杰轮"
stu.say_hi() # 输出: Hi大家好,我是周杰轮
从上述代码中可以得出
成员变量
成员方法
定义在类内部的函数称之为方法
在类中定义成员方法和定义函数基本一致,但仍有细微的区别:
def 方法名(self,形参1 ....,形参N):
方法体
可以得出,在方法定义的参数列表中,有一个:self关键字self关键字是成员方法定义的时候,必须填写
的。
在方法内部,想要访问类的成员变量,必须使用self
注意事项
self关键字,尽管在参数列表中,但是传参的时候可以忽略它
class Student:
name = None
def say_hi(self):
print(f"Hello,大家好")
def say_hi2(self,msg):
print(f"大家好!{msg}")
stu = Student()
stu.say_hi() # 调用的时候,无需传参
stu.say_hi2("很高兴认识大家") # 调用的时候,需要传msg参数
在传入参数的时候,self是透明的,可以不用理会他。
现实世界的事务和类
类和对象描述现实事务
程序中通过类来描述
基于类创建对象
class Student:
name = None # 名称
age = None # 年龄
tel = None # 手机号
stu1 = Student()
stu1.name = "周杰轮"
stu1.age = 31
stu1.tel = "18012340000"
stu2 = Student()
stu2.name = "周杰轮"
stu2.age = 31
stu2.tel = "18012340000"
思考🤔
上述代码中,为对象的属性赋值需要依次进行,略显繁琐。
有没有更加高的方式,一行代码完成?
这个括号,能否像函数(方法)那样,通过传参的形式对属性赋值?
使用构造方法: __init__()
class Student:
name = None # 可以省略
age = None # 可以省略
tel = None # 可以省略
def __init__(self,name,age,tel)
self.name = name
self.age = age
self.tel = tel
print("Student类创建了一个对象")
stu = Student("周杰轮",31,"18500000000")
构造方法注意事项
self
关键字
class Student:
# 构造方法
def __init__(self):
self.name = input("请输入学生姓名:")
self.age = int(input("请输入学生年龄:"))
self.address = input("请输入学生地址:")
for i in range(1, 11):
print(f"当前录入第{i}位学习信息,总共需录入10位学习信息")
stu = Student()
print(f"学生{i}信息录入完成,信息为:【学生姓名:{stu.name}, 年龄:{stu.age}, 地址:{stu.address}")
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
<__main__.Student object at 0x000001E952802150>
<__main__.Student object at 0x000001E952802150>
当类对象需要被转换为字符串时,会输出如上结果(内存地址)
内存地址没多大用,我们可以通过__str__方法,控制类转换为字符串的行为。
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return f"Student类对象,name={self.name},age={self.age}"
stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
Student类对象,name=周杰伦,age=25
Student类对象,name=周杰伦,age=25
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)
直接两个对象比较是不可以的,但是在类中实现__lt__
方法,即可同时完成:小于符号和大于符号 两种比较
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)
# 返回值 True或者False
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 <= stu2) # 结果 True
print(stu1 >= stu2) # 结果 False
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 == stu2)
是比较内存地址
,也即是:不同对象==比较一定是False结果封装表示的是,将现实世界事物的
封装到类中,描述为
从而完成程序对现实世界事物的描述
私有成员的语法
class Phone:
IMEI = None # 序列号
producer = None # 厂商
__current_voltage = 0.5 # 当前电压 私有成员变量
def call_by_5g(self):
print("5g通话已开启")
def __keep_single_core(self): # 私有成员方法
print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()
注意事项
使用私有成员
私有成员无法被类对象使用,但是可以被其他的成员使用
class Phone:
IMEI = None # 序列号
producer = None # 厂商
__current_voltage = 1 # 当前电压 私有成员变量
def call_by_5g(self):
if self.__current_voltage >= 1:
self.__keep_single_core()
print("5g通话已开启")
def __keep_single_core(self): # 私有成员方法
print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()
# 输出
让cpu以单核模式运行以节省电量
5g通话已开启
练习
class Phone:
__is_5g_enable = False # True表示5g开启,False表示5g关闭
def __check_5g(self):
if self.__is_5g_enable ==True:
print("5g开启")
else:
print("5g关闭,使用4g网络")
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
phone = Phone()
phone.call_by_5g()
# 输出
5g关闭,使用4g网络
正在通话中
思考🤔?
如果你是设计师,你会如何选择?
1.每一代新款手机,都从零开始设计
2.基于老款的设计,修修改改
设计新手机基于老款的基础上进行修改
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_4g(self):
print("4g通话")
class Phone2024(Phone):
face_id = '10001'
def call_by_5G(self):
print("2024新功能:5g通话")
单继承
语法:
class 类名(父类名)
类内容体
多继承
语法:
class 类名(父类1,父类2...父类3)
类内容体
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_4g(self):
print("4g通话")
class NFCReader:
nfc_type = "第五代"
producer = "HM"
def read_card(self):
print("NFC读卡")
def write_card(self):
print("NFC写卡")
class RemoteControl:
rc_type = "红外遥控"
def control(self):
print("红外")
class Myphone(Phone,NFCReader,RemoteControl):
pass
phone = Myphone()
print(phone.producer)
phone.call_by_4g()
phone.read_card()
# 输出
ITCAST
4g通话
NFC读卡
父类的品牌是ITCAST
父类的5g通话
ITCAST
复写
子类继承父类成员属性和成员方法,如果对其“不满意”,那么可以进行复写。
即:在子类重新定义同名的属性或方法即可。
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_5g(self):
print("父类的5g通话")
class Myphone(Phone):
producer = "HM"
def call_by_5g(self):
print("子类的5g通话")
phone = Myphone()
print(phone.producer)
phone.call_by_5g()
# 输出
HM
子类的5g通话
调用父类成员
class Phone:
IMEI = None
producer = "ITCAST"
def call_by_5g(self):
print("父类的5g通话")
class Myphone(Phone):
producer = "HM"
def call_by_5g(self):
# 方式1 调用父成员
print(f"父类的品牌是{Phone.producer}")
Phone.call_by_5g(self)
# 方式2 调用父类成员
print(f"父类的品牌是{super().producer}")
super().call_by_5g()
print("子类的5g通话")
注意事项
方式1调用父类成员
父类名.成员变量
父类名.成员方法(self)
方式2调用父类成员
super().成员变量
super().成员方法()
主要功能:
支持:
方法1
# 基础容器类型注解
my_list :list = [1,2,3]
my_tuple: tuple = (1,2,3)
mu_dict: dict = {"itheima":666}
# 容器类型详细注解
my_list: list[int] = [1,2,3]
my_tuple: tuple[int,str,bool] = (1,"itheima",True)
my_dict: dict[str,int] = {"itheima":666}
# 类对象类型注解
class Student:
pass
stu: Student = Student()
方法2
# 在注释中进行类型注解
var_1 = random.randint(1,10) # type: int
var_2 = json.loads('{"name":"zhangsan"}') # type: dict[str,str]
def func():
return 10
var_3 = func() # type: int
注意:类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误
形参注解
def add(x:int,y:int):
return x + y
add()
返回值注解
def func(data: list) -> list:
return data
print(func())
from typing import Union
my_list: list [Union[int,str]] = [1,2,"heima"]
def func(data: Union[int,str]) ->Union[int,str]:
pass
多态:指的是多种状态。完成某个行为是,使用不同的对象会得到不同的状态。
多态常作用在继承关系上.
比如
即:
抽象类(接口)
举例
class AC:
def cool_wind(self):
"""制冷"""
pass
def hot_wind(self):
"""制热"""
pass
def wring_l_r(self):
"""左右摆风"""
pass
class Midea_AC(AC):
def cool_wind(self):
print("美的空调核心制冷科技")
def hot_wind(self):
print("美的空调电热丝加热")
def wring_l_r(self):
print("美的空调无风感左右摆风")
class GREE_AC(AC):
def cool_wind(self):
print("格力空调变频省电制冷")
def hot_wind(self):
print("格力空调电热丝加热")
def wring_l_r(self):
print("格力空调静音左右摆风")
def make_cool(ac:AC):
ac.cool_wind()
midea = Midea_AC()
gree = GREE_AC()
make_cool(midea)
make_cool(gree)
# 输出
美的空调核心制冷科技
格力空调变频省电制冷