一、类的定义
1.定义类
class 类名称:
类的属性
类的行为
-
class
:关键词,表示要定义类 -
类的属性:即定义在类中的变量(成员变量)
-
类的行为:即定义在类中的函数(成员方法)
-
创建类对象的语法:
对象 = 类名称()
class Student:
name = None
age = None
def introduction(self):
print(f"我的名字是{self.name},我的年龄是{self.age}")
2.成员方法的定义
- self关键字是成员方法定义的时候,必须填写的。
- 在方法内部,想要访问类的成员变量,必须使用self
- self关键字,尽管在参数列表中,但是传参的时候可以忽略它。
def 方法名(self, 形参1,...):
方法题
二、魔术方法
1.__init__
构造方法
- Python类可以使用:
__init__()
方法,称之为构造方法 - 可以实现
- 在创建类对象(构造类)的时候,会自动执行。
- 在创建类对象(构造类)的时候,将传入参数自动传递给
__init__
方法使用。
class Student:
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def introduction(self):
print(f"我的名字是{self.name},我的年龄是{self.age}")
s = Student("FeiLink", 18)
s.introduction()
2.__str__
字符串方法
- 通过
__str__
方法,控制类转换为字符串的行为
class Student:
name = None
age = None
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Student对象, name={self.name}, age={self.age}"
s = Student("FeiLink", 18)
print(s)
3.__lt__
小于符号比较方法
- 对两个对象进行比较
__gt__
:大于__le__
:小于等于__ge__
:大于等于
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
s_1 = Student("FeiLink", 18)
s_2 = Student("EuropeanSheik", 20)
print(s_1 < s_2)
4.__eq__
比较运算符实现方法
- 不实现
__eq__
方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果 - 实现了
__eq__
方法,就可以按照自己的想法来决定2个对象是否相等了
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
s_1 = Student("FeiLink", 18)
s_2 = Student("EuropeanSheik", 18)
print(s_1 == s_2)
三、封装
1.介绍
- 封装表示的是,将现实世界事物的:
- 属性
- 行为
- 封装到类中,描述为:
- 成员变量
- 成员方法
2.私有成员的定义
- 私有成员变量:变量名以
__
开头(2个下划线) - 私有成员方法:方法名以
__
开头(2个下划线)
class Student:
name = None
age = None
__sex = None
def __init__(self, name, age):
self.name = name
self.age = age
def __exercise(self):
print("开始锻炼")
3.私有成员的使用
- 私有方法无法直接被类对象使用,但是可以被其它的成员使用。
- 私有变量无法赋值,也无法获取值
class Student:
name = None
age = None
__sex = None
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.__sex = sex
def __exercise(self):
print("开始锻炼")
def if_exercise(self):
if self.__sex == '男':
self.__exercise()
else:
print("不锻炼了")
s = Student("FeiLink", 18, '男')
s.if_exercise()
四、继承
1.介绍
- 继承表示将从父类那里继承(复制)来成员变量和成员方法(不含私有)
2.单继承
class 类名(父类名):
类内容体
class Teacher:
pass
class MaleTeacher(Teacher):
pass
3.多继承
- 注意事项:
- 多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
class 类名(父类1, 父类2...)
类内容体
class Teacher:
pass
class People:
pass
class MaleTeacher(Teacher, People):
pass
4.复写
- 介绍:子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写
- 方法:在子类中重新定义同名的属性或方法即可。
class People:
study = None
class Teacher(People):
study = True
- 一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员,如果需要使用被复写的父类的成员,需要特殊的调用方式:
- 方式一:调用父类成员
- 使用成员变量:
父类名.成员变量
- 使用成员方法:
父类名.成员方法(self)
- 使用成员变量:
- 方式二:使用
super()
调用父类成员- 使用成员变量:
super().成员变量
- 使用成员方法:
super().成员方法()
- 使用成员变量:
- 方式一:调用父类成员
- 注意:只能在子类内调用父类的同名成员。子类的类对象直接调用会调用子类复写的成员
五、类型注解
1.介绍
-
主要功能:
-
帮助第三方IDE工具(如
PyCharm
)对代码进行类型推断,协助做代码提示 -
帮助开发者自身对变量进行类型注释
-
-
支持:
- 变量的类型注解
- 函数(方法)形参列表和返回值的类型注解
-
类型注解仅仅是提示性的,不是决定性的,不会报错
2.语法
- 元组类型设置类型详细注解,需要将每一个元素都标记出来
- 字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value
变量: 类型
# 基础数据类型注解
name: str = "FeiLink"
age: int = 18
height: float = 185.7
# 类对象类型注解
class People:
pass
peo: People = People()
# 基础容器类型注解
l: list = [1, 2, 3]
t: tuple = (1, 2, 3)
S: set = {1, 2, 3}
D: dict = {"name": "FeiLink"}
s: str = "FeiLink"
# 容器类型详细注解
lis: list[int] = [1, 2, 3]
tup: tuple[str, int, float] = ("FeiLink", 18, 185.7)
se: set[int] = {1, 2, 3}
dic: dict[str, int] = {"FeiLink": 18}
- 也可以在注释中进行注解,格式:
# type: 类型
name = "FeiLink" # type: str
age = 18 # type: int
height = 185.7 # type: float
3.函数(方法)的类型注解——形参注解
def 函数方法名(形参名: 类型, 形参名: 类型):
pass
def c_add(x: int, y: int):
return x+y
print(c_add(1, 2))
4.函数(方法)类型注解——返回值注解
def 函数方法名(形参: 类型) -> 返回值类型:
pass
def c_add(x: int, y: int) -> int:
return x+y
print(c_add(4, 5))
5.Union类型
- 介绍:使用
Union[类型, ......, 类型]
可以定义联合类型,表示几种类型任选一 - Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。
from typing import Union
dic: dict[str, Union[str, int]] = {"name":"FeiLink", 'age': 18}
print(dic)
六、多态
1.介绍
- 多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
- 多态常作用在继承关系上.
- 抽象类:含有抽象方法的类称之为抽象类
- 抽象方法:方法体是空实现的(
pass
)称之为抽象方法
2.实例
class People:
def feature(self):
pass
class Man(People):
def feature(self):
return "身材魁梧"
class Woman(People):
def feature(self):
return "身材苗条"
def describe_feature(people: People):
print(people.feature())
a = Man()
b = Woman()
describe_feature(a)
describe_feature(b)