目录
一、面向对象编程概述
1、核心思想
把构成问题的各个事物分解成能够完整描述该实体功能的封装类,并通过对象的交互完成问题的解决。
类
是创建对象的模板,而对象是类的实例化。- 一个类可以创建多个对象。
2、特征
- 封装:不影响其它部分的情况下修改或扩展被封装的变化部分。
- 继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用。
- 多态:接口的多种不同的实现方式即为多态。
二、类和对象
1、类的创建
'''
bases为继承的父类,默认为object
class documentation string 类文档字符串,对类进行解释说明
'''
class ClassName(bases):
# class documentation string
class_suite #class_suite是类体,主要包含属性和方法
2、类的分类
- 经典类
- Python2.x中类定义的默认方式,不继承object类,其内部由属性和方法组成。
- 新式类
- Python3.x中类定义的默认方式,必须继承object类。
- 如果没有显示指明要继承的父类,则默认继承
object
类。
'''
经典类
'''
class A:
pass
'''
新式类
'''
class A(object):
pass
3、对象的创建
- 对象包含标识、属性和方法。
- 标识用于区分不同的对象。
- 属性和方法与类中的成员变量和成员函数相对应。
4、类的属性
实例的属性值默认共享类的属性值,除非实例对属性赋值则独立出来。
- 公有属性
- 类中和类外都可调用的属性。
- 无特别命名的话,变量默认为公有属性。
- 私有属性
- 只能被类中函数调用的属性。
- 以双下划线"__"命名。
- 内置属性
- 系统默认添加的属性。
- 前后各以双下划线"__"命名。
内置类属性
- __name__ 类的名字
- __doc__类的文档字符串
- __bases__所有父类构成的元祖
- __dict__类的属性
- __module__类定义的模块
- __class__实例对应的类(新式类)
内置实例属性
- __class__实例对象所属的类名
- __dict__实例对象的属性
5、类的方法
- 公有方法
- 类无法直接调用,实例对象才能调用。
- 私有方法
- 不能被外部的类和对象所调用。
- 定义时在方法名前加上双下划线"__"。
- 类方法
- 类和对象都可以调用。
- 被classmethod函数调用或被@classmethod装饰器修饰的方法。
- 静态方法
- 可被类直接调用&所有实例可共享。
- 通过staticmethod函数调用或被@staticmethod装饰器修饰的方法。
- 不需要声明"self"。
#公有方法
def Play(self):
pass
#私有方法
def __Play(self):
pass
#类方法1
def Play(self):
pass
Play_A=classmethod(Play)
#类方法2
@classmethod
def Play(self):
pass
#静态方法1
def Play():
pass
Play_B=staticmethod(Play)
#静态方法2
@staticmethod
def Play():
pass
类方法和静态方法原理上的区别:
- 静态方法不能使用self的方式调用。
- 静态方法调用时会预先将类中用到的属性和方法进行加载,而类方法则是随调随用。因此,类方法相比静态方法具有不占资源的优势,但是速度不及静态方法。
- 静态方法调用类中的属性时需要使用“类名.属性”的格式。
6、内部类
- 类的内部定义的类
- 内部类的调用
- 直接使用外部类调用内部类
- 先对外部类进行实例化,然后再实例化内部类。
class People():
code = 0
class Father():
code = 1
class Mother():
code = 2
zhangsan = People()
lisi = zhangsan.Father() # 第一种实例化方法
print(lisi.code) # 输出结果:1
liming = People.Mother() # 第二种实例化方法
print(liming.code) # 输出结果:2
7、魔术方法
- 所有以双下划线“__”包起来的方法。
- 实例化时会自动调用。
- 常见魔术方法
- “__init__()”(构造函数):初始化类的内部状态和参数。
- 如果不提供,系统提供默认的“__init__()”。
- “__ del __()”(析构函数):释放对象占用的资源,可选。
- “__init__()”(构造函数):初始化类的内部状态和参数。
三、类间关系
1、依赖关系
- 依赖关系的表现形式
- A:依赖方 B:被依赖方。
- 类A的某个成员方法的参数中使用了类B。
- 类B作为类A的方法返回值存在。
2、关联关系
- 关联关系是一种强依赖的关系。
- 类A和类B,如果互为成员变量则为双向依赖,否则为单向依赖。
关联关系与依赖关系的区别
- 依赖关系是一种临时的关系,依赖关系主要体现在方法参数,当调用方法时才有关系。
- 关联关系是一种长期的关系,主体现在成员变量,无论是否调用方法这种关系都存在。
3、继承关系
- 在已有类基础上构建子类的机制。
- 子类可以继承父类的功能&增加新的属性或功能。
注意:
- 子类可以对父类的方法进行覆盖实现。
- 子类可重新定义父类中的属性。
- 一个父类可由多个子类继承,一个子类也可继承多个父类。
- 如果父类定义了__init__()方法,子类也定义了自己的__init__()方法并且还要使用父类的__init__()方法, 子类需要显式调用父类的__init__()方法。
- 如果子类需要扩展父类的初始化行为,可以添加__init__()方法参数。
- 当继承的多个父类中有相同的属性或方法时,默认继承从左往右第一个父类的属性或方法。
4、多态
- 定义角度:同一类事物的多种形态,如猫的多种形态:白猫、黑猫、花猫等。
- 使用角度:同一种调用方式,不同的执行效果。
- 程序角度:定义了一个函数接口,在这个函数中定义了所有类中通用的功能。
- 根据不同对象的相同调用接口,就得到不同的结果。