类:负责创建对象的抽象“图纸”。
对象:用类创建的具体存在,不同对象间属性可能不同。
类的设计:
- 先明确程序中需要包含哪些类
- 类名:每一个单词首字母大写(驼峰命名法),词与词之间没有下划线。
属性:对对象的特征描述,__init__方法是专门用来定义一个类具有哪些属性的方法。一个对象的属性可以是另外一个类创建的对象
方法:对象具有的行为(动词)
注:
- 变量、数据、函数都是对象
- 接收对象的变量同样是对对象的引用
- 两个下划线开头、结尾,是对象的内置方法
文章目录
定义类
定义只包含方法的类:
class 类名:
def 方法1(self,参数列表): # 第一个参数必须是self
pass
def 方法2(self,参数列表):
pass
# 创建对象格式:
对象变量 = 类名()
定义属性
在初始化方法内部定义属性
- 在__init__方法内部使用,self.属性名=属性初始值 来定义属性
- 之后再使用类创建对象,都会有该属性
内置方法和属性
__del__方法:对象被从内存中销毁前,会被自动调用。是让对象最后一步做完del方法中的事情后。生命结束
__str__方法:返回对象的描述信息(由哪一个类创建的对象,在内存中的16进制地址),print函数输出使用。必须返回一个字符串。若再开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以使用str
封装
将属性和方法封装到一个抽象的类中
外界利用类创建对象,然后让对象调用方法
对象方法的细节都被封装再类的内部
注:双类时,先开发被使用的类,例如 房子要使用家具,先开发家具类
形参
形参只定义那些初始值需要从外部传递的量
身份运算符
在针对None比较时,建议使用is判别
is 判断俩个标识符是不是引用同一个对象
is not 判断两个标识符是不是引用不同对象
私有属性,私有方法
应用场景:在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用
定义方式:在属性名或方法名前加两个下划线"__"
若想在外界调用:
在这里插入代码片
继承
面向对象三大特性
- 封装:根据职责将属性和方法封装到一个抽象的类中
- 继承:实现代码的重用,相同的代码不需要重复编写
- 多态:不同对象调用相同方法,产生不同的结果,增加代码的灵活度
单继承
继承:子类拥有父类所有方法和属性(子类封装时仅在父类基础上添加比父类多的即可)
class 类名(父类名)
当父类封装的方法不能满足子类的需要:方法重写
对父类方法的扩展
- 在子类中重写
- 在需要的位置用
super().父类方法 # super是一个特殊的类,super()就是创建出的对象
来调用父类方法执行
3. 他位置针对子类的要求,编写子类特有的代码实现
子类访问父类中的私有属性/方法
通常无法访问父类中的私有属性/方法
若要访问,则要在父类自身的某公有方法中调用自己的私有,再用子类调用父类该公有。
多继承
- 有多个父类
class 子类名(父类名1,父类名2,……)
- 应避免多父类中方法名重复,子类仅执行先继承的父类中的同名fangfa
MRO方法
搜索顺序:method resolution order
内置属性__mro__ 可以查看方法的搜索顺序,用于多继承时判断方法、属性的调用路径
nonlocal关键字(似global)
nonlocal声明外层局部变量
内层函数想使用外层函数中的变量
通常情况下,内层函数可以调用外层函数的变量,但是不能修改