初始对象

# 设计类
class Student:
name = None # 记录学生姓名


if __name__ == '__main__':
# 创建对象
stu_1 = Student()
stu_2 = Student()
# 对象属性赋值
stu_1.name = "Tom"
stu_2.name = "Jane"

类的定义和使用

# 类的定义
class 类名称:
类的属性

类的行为
# 创建类对象的语法
对象 = 类名称()

成员方法的定义语法

def 方法名(self, 形参1, ......, 形参N):
方法体

self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思

  • 当我们使用类对象调用方法的是,self会自动被python传入

  • 在方法内部,想要访问类的成员变量,必须使用self

  • self关键字,尽管在参数列表中,但是传参的时候可以忽略它

class Student:
name = None

def say_hi(self, msg):
print(f"大家好,我叫{self.name}.{msg}!")


if __name__ == '__main__':
stu = Student()
stu.name = "Tom"
stu.say_hi("很高兴认识你")

构造方法

注意事项:

  • 构造方法不要忘记self关键字

  • 在方法内使用成员变量需要使用self

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("Joy", 31, "110")

其他类内置方法

__init__构造方法,是Python类内置的方法之一。这些内置方法也称为:魔术方法

__str__ 字符串方法

当对象需要被转换为字符串后,会输出内存地址

内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

改变前

class Student:
def __init__(self, name, age):
self.name = name
self.age = age


student = Student("Tom", 11)
print(student) # 结果为内存地址,<__main__.Student object at 0x000001B0FAD52220>
print(str(student)) # 结果为内存地址,<__main__.Student object at 0x000001B0FAD52220>

改变后

class Student:
def __init__(self, name, age):
self.name = name
self.age = age

def __str__(self):
return f"name={self.name},age={self.age}"


student = Student("Tom", 11)
print(student) # 结果: name=Tom,age=11
print(str(student)) # 结果: name=Tom,age=11

__lt__ 小于符号比较方法

直接对2个对象进行比较式不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号 和 大于符号 2种比较

说明

方法名: __lt__
传入参数: other, 另外一个类对象
返回值: TrueFalse
内容: 自行定义

示例

class Student:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
return self.age < other.age


stu1 = Student("Tom", 11)
stu2 = Student("Jane",13)
print(stu1 < stu2) # 结果: True
print(stu1 > stu2) # 结果: False

__le__ 小于等于比较符号方法

>=符号实现的魔法方法是: __ge__。不过,实现了__le____ge__就没必要实现了。

class Student:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
return self.age < other.age


stu1 = Student("Tom", 11)
stu2 = Student("Jane", 13)
print(stu1 <= stu2) # 结果: True
print(stu1 >= stu2) # 结果: False

__eq__ 比较运算符实现方法

  • 不实现__eq__方法,对象之间可以不交,但是是比较内存地址,也就是不同对象 == 比较一定是False结果。

  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等。

封装

私有成员:

  • 私有成员变量:变量名以__开头(2个下划线)

  • 私有成员方法:方法名以__开头(2个下划线)

继承

单继承

class 类名(父类名):
类内容体

多继承

注意事项:多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。即:先继承的保留,后继承的被覆盖。

class 类名(父类1, 父类2, ......, 父类N):
类内容体

pass关键字

pass 是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思。

复写

子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。即:在子类中重新定义同名的属性或方法即可。

注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是
调用子类复写的。

  • 方法一:调用父类成员
使用成员变量: 父类名.成员变量
使用成员方法: 父类名.成员方法(self)
  • 方法二:使用super()调用父类成员
使用成员变量: super().成员变量
使用成员方法: super().成员方法()

示例

class Phone:
def Info(self):
print("Phone")


class MyPhone(Phone):
def Info(self):
# 方式一
Phone.Info(self)
# 方式二
super().Info()
print("My_Phone")


my_phone = MyPhone()
my_phone.Info()

类型注解

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。

主要功能:

  • 帮助第三方 IDE 工具(如 PyCharm )对代码进行类型推断,协助做代码提示

  • 帮助开发者自身对变量进行类型注释

支持:

  • 变量的类型注解

  • 函数(方法)形参列表和返回值的类型注解

为变量设置类型注解

基础语法: 变量: 类型 = 值

# 基础数据类型注解
var_1: int = 10
var_2: float = 3.14
var_3: bool = True
var_4: str = "Tom"
# 类对象类型注解
class Student:
pass

stu: Student = Student()
# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3}
my_dict: dict = {"it": 666}
my_str: str = "Tom"
# 容器类型详细注解
my_list: list[int] = [1, 2, 3]
my_tuple: tuple[int, int, int] = (1, 2, 3)
my_set: set[int] = {1, 2, 3}
my_dict: dict[str, int] = {"it": 666}

注意:

  • 元组类型设置类型详细注解,需要将每一个元素都标记出来

  • 字典类型设置类型详细注解,需要2个类型,第一个是key,第二个是value。

注释中进行类型注解

语法: # type: 类型

var_1 = random.randint(1, 10)  # type: int

类型注解的限制

类型注解主要功能在于:

  • 帮助第三方 IDE 工具(如 PyCharm )对代码进行类型推断,协助做代码提示

  • 帮助开发者自身对变量进行类型注释(备注)

并不会真正的对类型做验证和判断。也就是,类型注解仅仅是提示性的,不是决定性的。以下代码不会报错!

var_1: int = "Tom"
var_2: str = 123

函数(方法)的类型注解

形参注解

def 函数方法名(形参名: 类型, 形参名: 类型, ......):
pass

返回值注解

def 函数方法名() -> 返回值类型:
pass

Union类型

如何让类型注解描述混合的数据类型,那就要需要用到Union数据类型了。

注意:使用前需要先导入typing模块

from typing import Union

my_list: list[Union[str, int]] = [1, 2, "number"]
my_dict: dict[str, Union[str, int]] = {"name": "Joy", "age": 31}

多态

抽象类

抽象类:含有抽象方法的类称之为抽象类。

抽象方法:方法体是空实现的(pass)称之为抽象方法。

class Animal:
def speak(self):
pass


class Dog(Animal):
def speak(self):
print("汪汪汪")


class Cat(Animal):
def speak(self):
print("喵喵喵")