类的构成


一种复杂的数据类型,将不同类型的数据和与这些数据相关的操作封装在一起的集合体


1
2
3
4
5
6
class className:
attrs = attrsValue
def __init__(self):
initStatements
def methodName(self):
methodStatements


实例


1
a = className()

类的具体对象

类实例化后,可以使用其属性和方法

self:本质上是类的一个实例,用于在类的内部传递参数导入的数据


方法


类似于函数

它们必须有一个额外的第一个参数名称 self,也可以用 this


构造方法


对象都有这个方法,用于对类进行初始化,在实例化的时候会调用


1
2
def __init__(self):
initStatements


属性


  1. 数据属性:类中的变量

  2. 函数属性:就是方法



类的私有属性


两个下划线开头,声明该属性为私有,不能通过类的外面调用。只能在类内部的方法中使用

如果想在类的外部调用私有属性,需要定义接口函数


类的私有方法


方法名以两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用


继承


1
2
3
4
5
6
7
8
9
class class_B:
a = 1
b = 2
class class_A(class_B):
c = 3
d = 4

A = class_A()
print(A.a)


如果 Class_A 继承自 Class_B,称:

  • Class_AClass_B 的子类, Class_BClass_A 的父类(超类)

  • Class_B 称为基类,Class_A 称为派生类


继承的作用:

  • 实现代码的重用

  • 实现属性和方法的继承


性质


  1. 子类拥有了父类的全部方法和属性

  2. 如果子类有和父类同样的方法和属性,子类的方法和属性会覆盖父类的方法和属性,这叫重写 (override)

  3. 子类可以继承系统已有的类


重度的继承并不是好事

重写显示了 OOP 的特性之一,多态 (Polymorphism):相同的信息给予不同的对象会引发不同的动作

super(class, object).method():用于调用父类的一个方法


抽象类


抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。


由于 Python 没有抽象类、接口的概念,所以要引入 abc 库

1
from abc import ABC, abstractmethod


要在 Python 类中使用抽象方法,首先要继承 abc.ABC,然后给实例方法加上装饰器 @abstractmethod,这样该类不能被直接实例化,要想使用该类,应继承该类并实现所有的抽象方法


多重继承


多重继承是一把双刃剑


继承顺序:

  1. 默认调用的是在括号中排前的父类的方法

  2. 广度优先


封装


封装(encapsulation)是对对象(object)的一种抽象,即隐藏类或者模块的某些部分,只提供接口(interface)给外部使用,封装和类的私有化息息相关


成功的面向对象语言的五个基本特性


  1. 万物皆为对象

  2. 程序是对象的集合,他们通过发送消息来告知彼此所要做的

  3. .每个对象都有自己的由其他对象所构成的存储

  4. 每个对象都拥有其类型

  5. 某一特定类型的所有对象可以接受同样的消息(多态)