1.类的组成部分
类的属性,称之为:成员变量
类的行为,称之为:成员方法
注意函数是写在类外的,定义在类内部的是方法
2.类和成员方法的定义语法
class 类名称:
成员变量
def 成员方法(self, 参数列表):
成员方法体
对象 = 类名称()
3.self的作用
表示类对象本身的作用
只有通过self,成员方法才能访问类的成员变量
self出现在形参列表中,但是不占用参数位置,无需理会
4.构造方法
名称是__init__,
作用:
构建类对象的时候会自动运行;
构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值
注意事项:
构造方法不要忘记self关键字
在方法内使用变量需要使用self
5.内置方法(魔术方法)
有特殊功能的内置方法称之为魔术方法,__init__就是
构造方法: __init__;
字符串方法: __str__;
小于、大于比较符号:__lt__;
小于等于、大于等于符号比较:__le__;
等于符号比较: __eq__,(如果没有写魔术方法,比较的是内存地址)
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}'
def __lt__(self, other):
return self.age < other.age
def __le__(self, other):
return self.age <= other.age
def __eq__(self, other):
return self.age == other.age
stu1 = Student('zjj', 18)
stu2 = Student('hhh', 13)
# 定义了__str__方法后,打印的是返回的字符串
print(str(stu1)) # 如果想让对象以字符串的形式输出,需要用内置方法,直接写返回的是内存地址
print(stu1.age < stu2.age) # False
print(stu1 > stu2)
print(stu1 >= stu2)
print(stu1 == stu2) # 如果没有__eq__方法,比较的是地址一不一样
6.封装
概念:将现实世界事物在类中描述为属性和方法,即为封装
现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时候也需要达到这个要求,所以需要私有成员和私有方法
定义方法:
私有成员变量和方法的命名均以__开头即可
访问限制:
类对象无法访问私有成员
类中的其他成员可以访问私有成员
7.继承
继承是一个类,继承另外一个类的成员变量和方法
语法:
class 类(父亲【,父亲2,……父亲N】):
类内容体
子类构建的类对象,可以有自己的成员变量和成员方法;可以使用父类的成员变量和成员方法
单继承:一个类继承另一个类
多继承:一个类继承多个类,按照顺序从左向右依次继承
多继承中,如果 父类有同名方法和属性,先继承的优先级高于后继承的优先级
复写
子类对父类的成员属性或成员方法进行重新定义
复写的语法:
在子类中重新实现同名成员方法或属性即可
在子类中如何调用父类成员:
①方式一
调用父类成员
使用成员变量: 父类名.成员变量
使用成员方法: 父类名.成员方法(self)
② 方式二
使用super()调用父类成员
使用成员变量: super()成员变量
使用成员方法: super().成员方法()
只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的
8.类型注解
(1)在代码中涉及数据交互时,对数据类型进行显示的说明,可以帮助
pyCharm等开发工具对代码做类型推理协助代码显示
开发者自身做类型的备注
(2)类型注解支持
变量的类型注解
函数(方法)的形参和返回值的类型注解
(3)变量的类型注解语法
语法1: 变量:类型
语法2: 在注释中, # type: 类型
元组类型设置类型详细注解时,需要将每一个元素都标记出来
字典类型设置类型详细注解时,需要两个类型,第一个是key,第二个是value
(4)注意事项
类型注解只是提示性的,并非决定性的。数据类型和注释类型无法对应时不会导致错误
9.函数类型注解
有形参的类型注解和返回值的类型注解
语法:
def 函数方法名(形参:类型,……形参:类型) -> 返回值类型:
pass
注意返回值类型注解的符号使用 ->
10.Union类型
使用Union可以定义联合类型注解
使用方式
导包: from typing import Union
使用: Union[类型,……, 类型]
11.多态
定义:多态指的是同一个行为,使用不同得对象获得不同得状态
如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态
抽象类(接口)的定义:包含抽象方法的类,称之为抽象类。抽象方法指没有具体实现的方法(pass)
抽象类的作用:多用于做顶层设计(设计标准),以便子类具体实现,也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法并配合多态使用,获取不同的工作状态。