面向对象
三大特征
- 封装
- 继承
- 多态
封装
特性
- 减少代码冗余
- 隐藏代码实现细节
- 保证数据安全性
继承
特性
- 减少代码冗余
- 父类功能不满足子类要求时,子类可重写父类方法(可对功能进行扩展)
子类与父类初始化重写与继承
子类复写父类 __init__
方法,需要调用父类方法,使用 super()
调用,如super().__init__(参数列表)
子类与父类重写或继承可分为以下三种情况
- 子类不重写
__init__
,实例化子类时,会自动调用父类__init__
- 子类重写
__init__
,实例化子类,不会调用父类__init__
- 子类重写
__init__
,要继承父类,可使用super
关键字
重写且需继承语法
super(子类,self).__init__(参数1,参数2,...)
or
super().__init__(参数1,参数2,...)
or
父类名称.__init__(self, 参数1,参数2,...)
super加强
子类重写父类方法,且继承父类方法
多态
特性
- 开闭原则:对修改是关闭的,对扩展是开放的
- 不同对象执行同一个动作(功能),产生不同的效果
- 继承才会有多态
类
拥有相同属性和行为的多个事物的抽象描述
关键字 class
类名 大驼峰
定义类
class 类名:
成员:
成员变量: 属性
成员方法: 功能
创建对象时,会调用类的__init__
方法初始化
使用对象
创建对象
变量 = 类名()
通过.
访问对象的成员(成员包括属性和方法)
语法
对象.成员
使用属性
获得属性:对象.属性名
增加属性:对象.新属性名 = 属性值
修改属性:对象.旧属性 = 新值
删除属性:del 对象.属性名
调用方法
语法
对象.方法名([参数列表])
注意:定义方式设置第一个参数是 self,调用方法时不用传递 self 参数,解释器会自动传入
对象方法中的self
- 表示调用该方法的对象
- 对象方法中可通过 self 获取到调用该方法的对象,可通过 self 操作对象上的属性和方法
初始化__init__()
方法
一般会在 __init__()
中定义对象的属性和绑定属性值
创建对象时自动调用执行__init__()
初始化方法
语法
class 类名:
def __init__(self[, 参数列表]):
init()自定义参数
class People:
def __init__(self, name, age):
self.name = name
self.age = age
pass
__str__()
方法
__str__()
方法可复写输出信息
print(object)
打印对象,会输出创建对象时在内存中的地址__str__()
方法复写后,print(object)
可输出复写的输出信息
语法
class 类名:
def __str__(self):
return "对象的描述信息"
注意
- 名称固定
__str__()
print(object)
打印对象时,被 Python 自动调用执行- 返回对象的描述信息
- 不能自定义参数
私有成员
类的私有属性
__private_attrs
两个下划线开头,声明该属性为私有,不可在类外使用或直接访问
类内部方法使用时用 self.__private_attrs
语法
class 类名:
def __init__(self):
self.__属性名 = "属性值"
def __方法名(self):
#方法体
提供 get 方法以供外部访问
作用
- 保证数据安全性,不能随意修改
- 提高封装性,保护数据安全,隐藏具体细节
类方法
类也是一个对象,给类对象添加方法,叫做类方法
类方法的定义
- 必须使用装饰器
@classmathod
来标识方法为类方法 - Python解释器自动把类对象传入给类方法的第一个参数,通常使用cls(class缩写)作为类方法第一个形参,调用时不用传参
- 类方法所有对象共享,可通过类或实例对象进行调用
静态方法
静态方法的定义
- 需要通过修饰器
@statemethod
来修饰,静态方法不需要额外定义参数 - 静态方法可通过类或对象调用
魔术方法
Python 中方法名是__xxx__()
,有特殊功能,因此叫“魔法”方法
在此贴上原文地址:python魔术方法大全-musen
模块导入
如果要使用自定义的类,需要在当前文件中导入自定义类的文件,或导入自定义的类
语法
import 文件名
or
form 文件名 import 文件内定义的类名
模块导入后,可以__name__
区分,当前执行模块的__name__
是__main__
,其他模块的__name__
是模块名本身