面向对象
初始对象
# 设计类 |
类的定义和使用
# 类的定义 |
成员方法的定义语法
def 方法名(self, 形参1, ......, 形参N): |
self
关键字是成员方法定义的时候,必须填写的。
它用来表示类对象自身的意思
当我们使用类对象调用方法的是,
self
会自动被python传入在方法内部,想要访问类的成员变量,必须使用self
self
关键字,尽管在参数列表中,但是传参的时候可以忽略它
class Student: |
构造方法
注意事项:
构造方法不要忘记
self
关键字在方法内使用成员变量需要使用
self
class Student: |
其他类内置方法
__init__
构造方法,是Python类内置的方法之一。这些内置方法也称为:魔术方法
__str__ 字符串方法
当对象需要被转换为字符串后,会输出内存地址
。
内存地址没有多大作用,我们可以通过__str__
方法,控制类转换为字符串的行为。
改变前
class Student: |
改变后
class Student: |
__lt__ 小于符号比较方法
直接对2个对象进行比较式不可以的,但是在类中实现__lt__
方法,即可同时完成:小于符号 和 大于符号 2种比较
。
说明
方法名: __lt__ |
示例
class Student: |
__le__ 小于等于比较符号方法
>=
符号实现的魔法方法是: __ge__
。不过,实现了__le__
,__ge__
就没必要实现了。
class Student: |
__eq__ 比较运算符实现方法
不实现
__eq__
方法,对象之间可以不交,但是是比较内存地址,也就是不同对象 == 比较一定是False结果。实现了
__eq__
方法,就可以按照自己的想法来决定2个对象是否相等。
封装
私有成员:
私有成员变量:变量名以__开头(2个下划线)
私有成员方法:方法名以__开头(2个下划线)
继承
单继承
class 类名(父类名): |
多继承
注意事项:多个父类中,如果有同名的成员,那么默认
以继承顺序(从左到右)为优先级。即:先继承的保留,后继承的被覆盖。
class 类名(父类1, 父类2, ......, 父类N): |
pass关键字
pass 是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思。
复写
子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。即:在子类中重新定义同名的属性或方法即可。
注意:只可以在子类内部
调用父类的同名成员,子类的实体类对象
调用默认是
调用子类复写的。
- 方法一:调用父类成员
使用成员变量: 父类名.成员变量 |
- 方法二:使用super()调用父类成员
使用成员变量: super().成员变量 |
示例
class Phone: |
类型注解
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:
帮助第三方 IDE 工具(如 PyCharm )对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释
支持:
变量的类型注解
函数(方法)形参列表和返回值的类型注解
为变量设置类型注解
基础语法: 变量: 类型 = 值
# 基础数据类型注解 |
# 类对象类型注解 |
# 基础容器类型注解 |
# 容器类型详细注解 |
注意:
元组类型设置类型详细注解,需要将每一个元素都标记出来
字典类型设置类型详细注解,需要2个类型,第一个是key,第二个是value。
注释中进行类型注解
语法: # type: 类型
var_1 = random.randint(1, 10) # type: int |
类型注解的限制
类型注解主要功能在于:
帮助第三方 IDE 工具(如 PyCharm )对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释(备注)
并不会真正的对类型做验证和判断。也就是,类型注解仅仅是提示性的,不是决定性的。以下代码不会报错!
var_1: int = "Tom" |
函数(方法)的类型注解
形参注解
def 函数方法名(形参名: 类型, 形参名: 类型, ......): |
返回值注解
def 函数方法名() -> 返回值类型: |
Union类型
如何让类型注解描述混合的数据类型,那就要需要用到Union
数据类型了。
注意
:使用前需要先导入typing模块
from typing import Union |
多态
抽象类
抽象类:含有抽象方法的类称之为抽象类。
抽象方法:方法体是空实现的(pass)称之为抽象方法。
class Animal: |