面向对象
- 各类事物在编程语言中可以表示为抽象的类
- 为了把事物具体化,需要通过创建实例化对象来完成
- 面向对象的三大特性(下文对每个特性会做详细介绍)
Class类的定义
- 命名,使用大驼峰标准,如
class MyName:
- class类中有一个
self
参数,这个参数是Python自动管理的,当所创建的实例化对象调用类中方法时,Python会自动把该实例对象传递给该方法的self形参;因此,一般类中所有的方法都会在定义时包含一个self形参 - class类中应该有一个初始化方法
def __init__(self, variable):
,该方法会在每次实例化对象的时候被自动调用,从而对实例对象的一些属性进行初始化,__init__初始化属性所使用的值即为创建实例化对象语句的括号中传入的值,如name = MyName('David')
- call 方法是 Python 中一个特殊的魔法方法,允许类的实例像函数一样被调用。也就是说,当你给一个对象加上括号(())时,Python 会自动调用该对象的 call 方法
class MyCallableClass:
def __init__(self, name):
self.name = name
def __call__(self, greeting):
return f"{greeting}, {self.name}!"
my_obj = MyCallableClass("Alice")
print(my_obj("Hello"))
封装
- 为什么要封装?
- 怎么保护数据安全性
- 第一步,将属性定义为隐藏属性,即在定义时在属性名前加双下划线,如
__hidden_variable = 1
,这种属性是无法在实例对象上通过对象.属性
的方式读取和修改的 - 第二步,如果想要读取和修改隐藏属性,需要在类内定义对应的方法,如图所示
继承
- 为什么要继承?
- 一个主要原因就是避免重复代码的书写,当一个子类和父类有相同的操作时,可以通过继承父类直接复用父类里对应操作的定义
- 怎么继承
- 在定义子类时,如
class son:
,改为,class son(father):
,此时,子类son将继承father里的全部属性和方法
- 继承的特点
- 在继承后,当子类的实例化对象调用一个方法时,将首先在子类中搜寻,如果子类没有,去父类搜寻,如果父类也没有,就去父类的父类搜寻,以此类推;所以,继承是优先使用自己的,如果自己没有再采用父辈的
- super()
- 在定义子类的时候,对于没有重定义的属性或方法,将默认继承父类;而对于重定义的一些属性和方法,如果只是想要在父类对应方法上进行扩展,可以先使用
super().method()
的方式继承(调用)父类的对应method定义,再在之后加上自己的扩展代码 - 如图所示,父类中的__init__方法只初始化了type和color两个属性,而子类在此基础上扩展定义了radius属性,因此可以利用super来在保留父类方法的同时扩展自己的方法
多态
- 为什么要有多态这个特性?
- 定义
- 简单来说,多态就是指 不同类 或 一个类自己内部 的方法名称相同,但是形参和函数体不同,如一个类内同时定义了
def add(self, a, b):
和def add(self, a, b, c):
,若传入三个实参,将调用后者,传入两个实参,将调用前者 - 这种情况下,解释器将根据实例对象的类型、传入实参的不同选择对应的方法进行调用,此时就不需要对功能类似的方法定义多种不同的方法名了