Class类学习
-
学习类,以及类的有关方法,都基本到了这门语言语法的末尾章节了。类相较于其他知识点也是比较难理解的。如构造方法,类的继承,多态。
1,类的构造方法
-
1,构建类的方法的时候会自动执行
-
2,构建类对象的传参会传递给构造方法
-
3,构造方法可以给类的成员变量赋值
写法
__init__(self):
Demo
class Student_info:
#此处的定义可以不写,因为在self方法中self.name 既有赋值功能也有定义的功能
name = None
age = None
tel = None
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel
print('Student类创建了一个类对象')
student = Student_info('周杰伦',18,'123123213')
print(f"我叫{student.name},年龄{student.age},电话号码是{student.tel}")
2,魔术方法(str, lt, le, eq)
Demo
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self): #使用此方法后,打印stu1类对象就不再是内存地址,而是自定义的字符串
return f'我的名字是{self.name},年龄是{self.age}'
def __lt__(self, other): #判断该类对象的age是否大于另一个类对象的age
return self.age > other
def __le__(self, other): #判断该类对象的age是否大于或等于另一个类对象的age
return self.age >= other
def __eq__(self, other): #判断该类对象的age是否等于另一个类对象的age
return self.age == other
stu1 = Student("凌俊杰", 18)
stu2 = Student("周杰伦", 20)
print(stu2)
print(stu1 > stu1)
3,私有成员变量和成员方法
-
类对象无法访问私有成员,但是类中其他成员可以访问私有成员
Demo
class Phone:
__is_5G_enable = True #定义私有成员变量
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() #调用类的公开方法
4,继承(单继承和多继承)
Demo
class Phone:
IMIE = None # 序列号
producer = 'Itcast' # 生产厂商
def call_by_4g(self):
print("4G通话")
class Phone2023(Phone): # 继承Phone这个类
face_id = '13223'
def call_by_5g(self):
print("开启5G新时代")
class NFC_Reader:
producer = 'Tecent'
def read_card(self):
print("NFC读卡")
def write_card(self):
print("NFC写卡")
class Remote_Control:
rc_type = '红外遥控'
def control(self):
print("红外遥控器开启")
class MyPhone(Phone2023,Remote_Control, NFC_Reader):
pass
phone = MyPhone()
phone.read_card()
phone.write_card()
phone.control()
phone.call_by_4g()
phone.call_by_5g()
print(phone.producer)
5,复用
-
(子类对父类的某些函数或者变量不满意时可以采用复用)
Demo
class Phone:
producer = 'itcast'
def call_by_5G(self):
print('5G通话开启')
class MyPhone(Phone):
producer = 'itheima'
def call_by_5G(self):
print('开启单核模式,确保CPU执行时省电')
#调用父类的成员函数和成员方法,两种调用方法,super()或者是Phone直接写父类
print(f"父类的生产厂商是:{Phone.producer}")
super().call_by_5G()
print("5G通话关闭")
phone = MyPhone() #将类实例化
phone.call_by_5G()
6,类型注解
Demo
import random
import json
class Student:
pass
stu: Student = Student()
list1: list = [1, 2, 3] #基础容器类型注解
list2: list = [1, 2, 3] #详细容器类型注解
my_tuple: tuple= (1, 'itheima',True) #详细容器类型注解
var1 = random.randint(1,10) #type: int
var2 = json.loads('{"name": "zhangsan"}') #type: dict[str, str]
def func():
return 10
var3 = func() #type: int
7,对形参类型和返回值进行注解
-
对形参类型进行注解要写在函数形参的括号中
-
对返回值进行注解要在括号之后冒号之前进行注解(如 -> )
Demo
def func(x: int, y: int) -> int:
return x + y
ret = func(2, 5)
print(ret)
def func1(data: list) -> list:
return data
print(func1(1)) #这里说明函数的注解只是提示性的而非强制性的,哪怕参数传递的不对也不会给报错
8,Union联合类型注解
Demo
from typing import Union #(使用Union之前必须先导包)
#首先先写个普通的注解
my_list: list[Union[int, str]] = [1, 2, 'itheima', 'itcast'] #此注解表明我的list是个int和str混合类型
def func(data: Union[str, int]) -> Union[int, str]: #表明函数的参数和返回值为int或者str类型
pass
func() #在函数上面按住CRTL+ P会看到提示传入参数的类型为data[int, str]类型
9,多态
Demo
class AC: # 定义抽象类(好比是一个标准),包含抽象方法(没有具体实现的方法叫做抽象方法),要求子类必须实现标签:__,age,class,print,5G,self,def From: https://www.cnblogs.com/liam-sliversucks/p/17340496.html
def cool_wind(self): # 吹冷风
pass
def hot_wind(self): # 吹热风
pass
def swing_l_r(self): # 左右摆风
pass
class Midea_AC(AC): # 美的空调类继承AC类,复写AC类的抽象方法
def cool_wind(self):
print("美的空调核心制冷科技")
def hot_wind(self):
print("美的空调电热丝加热")
def swing_l_r(self):
print("美的空调无风感左右摆风")
class Gree_AC(AC): # 格力空调类继承AC类,复写AC类的抽象方法
def cool_wind(self):
print("格力空调核心制冷科技")
def hot_wind(self):
print("格力空调电热丝加热")
def swing_l_r(self):
print("格力空调无风感左右摆风")
def make_cool(ac: AC): # 该吹风函数形参为ac,而且是一个AC类型的参数
ac.cool_wind() #
# 一般不会构建抽象类的对象,也就是不将抽象类(AC)实例化,而是将抽象类的子类实例化
gree_ac = Gree_AC() # 实例化空调类对象
midea_ac = Midea_AC() # 实例化空调类对象
make_cool(gree_ac) # 传入子类对象