class是关键字,表示要定义类了
类的属性,即定义在类中的变量(成员变量)
类的行为,即定义在类中的函数(成员方法)
self关键字是成员方法定义的时候,必须填写的。
- 它用来表示类对象自身的意思
- 当我们使用类对象调用方法时,self会自动被py传入
- 在方法内部,想要访问类的成员变量,必须使用self
class Student:name=Noneage=Nonedef fun(self):print(self.name)#访问类中的成员变量,需要用self访问
__init__() 构造方法
可以实现:
在创建类对象是会自动执行,将参数自动传递给__init__()方法使用
class Student:def __init__(self,name,age,id):self.name=nameself.age=ageself.id=idprint('创建对象自动调用此方法')student1=Student('zhangsan',19,'0001')
类内置方法(魔术方法):
__str__:
控制类转换成字符串的行为
class Student:def __init__(self,name,age,id):self.name=nameself.age=ageself.id=idprint('创建对象自动调用此方法')def __str__(self):return f'name:{self.name},age:{self.age}'student1=Student('zhangsan',19,'0001')print(str(student1))
#name:zhangsan,age:19#若不写__str__方法,则输出的是地址值
__lt__:
直接比较两个对象是不可以的,但是在类中实现__lt__()方法的符号比较,即可同时完成< > 两种比较
class Student:def __init__(self,name,age,id):self.name=nameself.age=ageself.id=idprint('创建对象自动调用此方法')def __lt__(self,other):return self.age<other.agestudent1=Student('zhangsan',19,'0001')
student2=Student('zhangsan',20,'0001')print(student1>student2)
#False
__le__:
判断小于等于
格式与lt方法类似
__eq__:
若没有写eq方法,比较两个对象相等时,返回False,因为自动比较的是内存地址值。
class Student:def __init__(self,name,age,id):self.name=nameself.age=ageself.id=idprint('创建对象自动调用此方法')def __eq__(self,other):return self.name==other.namestudent1=Student('zhangsan',19,'0001')
student2=Student('zhangsn',19,'0001')print(student1==student2)
#False
封装
私有成员命名,在名称前以__开头。
类对象无法访问私有成员
类中的其他成员可以访问私有成员
class Phone:__current_voltage=0def __keep_single_core(self):print('让CPU以单核模式运行')def call_by_5g(self):if self.__current_voltage>=1:print('5g开启')else:self.__keep_single_core()
ph1=Phone()
ph1.call_by_5g()#让CPU以单核模式运行
继承:
继承有单继承和多继承。
多继承注意事项:
多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
即先继承的保留,后继承的覆盖
pass关键字的作用:
占位语句,保证类定义的完整性。
复写父类成员:在子类中重新定义同名的属性或方法即可。
调用父类同名成员:
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
若需要使用被复写的父类的成员,需要特殊的方式。
方式一:
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
方式二:
使用super()调用父类成员
使用成员变量:super().成员变量
使用成员方法:super().成员方法
注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的
class Human:name='zhangsan'nation='China'def fun(self):print(f"{self.name}在{self.nation}诞生")class student(Human):def fun(self):super().fun()print(f"{self.name}在{self.nation}诞生")stu1=student()
stu1.fun()#zhangsan在China诞生
#zhangsan在China诞生
类型注解
主要功能:帮助第三方工具对代码进行类型推断,协助代码作提示。
变量类型注解的两种形式:
1. 变量:类型=值
2. 在注释中,#type:类型
函数的类型注解-形参注解:
def 函数方法名(形参名:类型,形参名:类型.........)->类型:
pass
前面对传入的形参进行注解,后面为返回值进行注解
Union联合类型:
使用Union可以定义联合类型注解
先导包: from typing import Union
使用:UNion[类型,.......,类型]
from typing import Unionmy_list:list[Union[str,int]]=[1,2,'skcm','uisj']def func(data:Union[int,str])->Union[int,str]:pass
它并不会真正的对类型做验证和判断,类型注解仅仅是提示性的,不是决定性的。
多态:
同一个行为,使用不同的对象获得不同的状态。
class voice: #抽象类def ani_voice(self):pass#抽象方法class Dog(voice):def ani_voice(self):print('汪汪汪')class Cat(voice):def ani_voice(self):print('喵喵喵')def fun(voi:voice):voi.ani_voice()dog=Dog()
cat=Cat()
fun(dog)
fun(cat)
抽象类(接口):
包含抽象方法的类,叫做抽象类,抽象方法是指没有具体实现的方法(pass)称之为抽象方法。
class voice: #抽象类def ani_voice(self):pass#抽象方法class dog(voice):def ani_voice(self):print('汪汪汪')class cat(voice):def ani_voice(self):print('喵喵喵')