面向对象特点
- 注重对象与职责,不同对象,不同职责;
- 应对复杂项目开发,提供固定模版;
- 基于面向过程;
- 封装:根据功能将属性和方法封装到一个抽象的类中;
- 继承:实现代码复用,相同代码不需多次编写;
- 多态:不同对象调用相同方法得出不同结果,增加了代码的灵活度;
对象
类创建出来的一个具体存在,可直接使用,拥有类所具有的属性与方法;
类与对象的关系
- 类是模版,对象根据类创建而出,先有类再有对象;
- 类只有一个,但对象可以有多个;
- 类中定义属性与方法,对象中只能具有所创建而出的类所具有的属性与方法;
类的设计三要素
- 类名:一般满足大驼峰命名法;
- 属性:一类事物所具有的特征;
- 方法:一类事物所具有的行为;
添加类的属性
- 在创建类之后,对象可以在外部直接使用
.属性名
给对象增加属性,但是这种方式不推荐使用,因为它并没有将属性封装到类的内部中,只是对象临时的属性; - 在初始化方法内部定义属性之后,在使用该类创建新对象时,所创建的新对象都会拥有该属性,使用方法:
self.属性名 = 属性初始值
;
对象及内置方法生命周期
方法 | 功能 |
---|---|
__init_ |
初始化对象并设置属性 |
__del_ |
销毁对象 |
__str_ |
必须返回一个字符串,定制变量的输出信息 |
- 对象从调用
类名()
创建时生命周期即开始; - 对象生命周期内,既可以访问对象属性,也可以调用对象方法;
- 对象的
__del__
方法一旦调用,对象的生命周期即结束;
身份运算符
- 功能:用于比较两个对象内存地址是否一致–即判断是否是对同一对象的引用;
-
is
和==
的区别-
is
用于判断两个变量引用对象是否为同一个; -
==
用于判断引用变量的值是否相等;
-
私有属性与方法
- 定义方式:属性名或方法名之前增加两个下划线,则定义的属性或方法就是私有属性或方法;
- 特点:在对象方法外部是不能直接访问的,只有在方法内部才能够访问;
- 子类对象不能直接访问父类私有属性或私有方法,但可以通过父类的公有方法间接访问私有属性或私有方法;
伪私有属性与方法
- 对于定义的私有属性与方法,通过
_类名__名称
的方式即可访问,所以说私有属性或方法并非真正意义的私有,而是内部通过特殊处理伪装起来使得外界无法访问的。虽然私有属性或方法我们都可以访问,但日常开发中最好不要使用这种方式来访问私有属性或方法;
注意
- 内置函数
__str__
必须返回一个字符串; - 对象的方法内部,可以直接访问对象属性;
- 对于多个对象之间,各自的属性是互不干扰的;
继承
- 语法
class A(B):
pass
- 子类继承于父类,拥有父类所封装的属性与方法,无需二次开发;
- 子类只需要封装属于自己特有的,有别于父类的属性与方法即可;
- 特性:传递性;
- 方法重写:
- 覆盖基类方法;
- 对基类方法进行拓展,需要使用
super().父类方法
来调用父类方法的执行,然后在方法中其他位置进行对子类方法的扩展;
多继承
- 语法
class 子类名(父类名1, 父类名2,...):
pass
- 注意事项
- 父类名应该避免重复;
- 不同父类中的属性或方法应该避免同名;
新式类与经典类
- 新式类
class A(object):
pass
- 经典类
class A:
pass
实例化
- 每个对象实例化是都有自己独立的内存空间,用于保存各自不同的属性;
- 而多个对象的方法在内存中只有一份,在调用方法时需要吧对象的引用传递到方法内部;
类方法
- 语法
@classmethod
def 类方法名(cls):
pass
- 在类方法内部
- 通过
cls.
访问类的属性; - 通过
cls.
调用其他类方法;
- 通过
静态方法
- 需要封装为静态方法的情况:
- 无需访问实例属性或实例方法;
- 无需访问类属性或类方法;
- 语法
@staticmethod
def 静态方法名():
pass
实例方法、类方法、静态方法之间的区别
- 实例方法:方法内部需要访问实例属性,实例方法内部需使用
类名.
访问类属性; - 类方法:方法内部只需要访问
类属性
; - 静态方法:方法内部不需访问
实例属性
与类属性
;