目录
类与对象
类(Class)
定义类
self 关键字
“魔法方法”
对象(Object)
定义对象
获取属性及调用方法
面向对象(Object-Oriented,OO)
封装(Encapsulation)
继承(Inheritance)
多态(Polymorphism)
抽象类与抽象方法
面向对象的其它特征
面向过程(Procedural Programming)
面向对象与面向过程的区别
类与对象
类(Class)
对一类具有相同属性和方法的对象的抽象描述
属性(Attributes):描述对象的特征或状态(也称为成员变量)
方法(Methods):描述对象的行为或功能(也称为成员函数)
定义类
class ClassName(object): attribute = value # 定义类的属性(变量) def __init__(self): self.attribute = value # 定义实例的属性【self关键字只能在函数内】 def function(self): # 定义类的方法(函数) passself 关键字
代表 指向 类 的当前实例对象(谁调用函数,self就是谁)
为 实例方法 提供 访问该实例自身属性和方法 的 引用
是类方法的第一个参数,指向 调用该方法 的 实例对象
“魔法方法”
【在特殊情况下会被自动调用】
def __init__(): 在定义 对象 时会被自动调用执行
def __init__(self, color, number): self.color = color self.number = numberdef __str__(): 在输出打印 对象的属性 时会被自动调用执行
def __str__(self): return self.attribute # 返回值的类型必须是字符串类型def __del__(): 在 对象的生命周期结束时(被销毁) 时会被自动调用执行
def __del__(self): pass对象(Object)
对象是类的实例,是根据类创建的具体实体,一个类可以创建多个对象
定义对象
variable = ClassName()获取属性及调用方法
在类内获取属性及调用方法:
self.attribute # self.属性 self.function() # self.函数名()在类外获取属性及调用方法:
variable.attribute # 变量名.属性 variable.function() # 变量名 . 函数名()面向对象(Object-Oriented,OO)
一种编程范式(程序设计思想)【一切皆对象】
以对象为核心,通过封装、继承、多态等机制,组织和复用代码
优点:模块化、复用性、灵活性
封装(Encapsulation)
将数据(属性)和操作数据的方法(行为)绑定在一起 形成一个独立的对象
对外隐藏内部实现细节,仅暴露必要接口
【封装不只对于类的封装,也对于函数的封装】
封装可以为属性和方法添加私有权限(只能在类内访问)【类外通过公共方法(接口)访问】:
class ClassName(object): def __init__(self, value): self.__attribute = value # 定义私有属性 def __function(self): # 定义私有方法 return self.__attribute def function(self): # 定义公共方法,对外提供接口 return self.__function() # 调用私有方法,返回私有属性继承(Inheritance)
多个类之间的所属关系
子类(派生类)默认继承父类(基类、超类)的属性和方法
单继承:
class ClassName(object): # 定义父类 attribute = value def function(self): pass class Subclasses(ClassName): # 定义子类继承自父类 attribute = value def function(self): pass多继承:
class ClassName(object): # 定义父类 attribute = value def function(self): pass class SubclassesOne(ClassName): # 定义子类继承自父类 attribute = value def function(self): pass class SubclassesTwo(ClassName, SubclassesOne): # 定义子类继承自两个父类 attribute = value def function(self): pass子类调用父类方法:
class SubclassTwo(ClassName, SubclassesOne): ClassName.function() # 调用指定基类的函数 —> 父类名.方法名(self) super().function() # 只能调用传入的第一个父类的函数子类调用父类的同名方法:
当一个类有多个父类时,默认使用第一个父类的同名属性和方法,具体调用顺序依据MRO
可以使用 类名.__mro__ 或 类名.mro() 方法查看调用的先后顺序
MRO(Method Resolution Order):方法解析顺序
方法重写:
当 子类属性或方法 与 父类的属性或方法 名字相同 时 从父类继承下来的成员可以 重新定义
多层继承:指多个类之间的继承的层级关系
多态(Polymorphism)
同样一个函数在不同的场景下有不同的状态
多态的条件:
1、有继承 (定义父类、定义子类,子类继承父类)
2、函数重写 (子类重写父类的函数)
3、父类引用指向子类对象 (子类对象传给父类对象调用者)
class Bird: def fly(self): print("Bird can fly") class Penguin(Bird): def fly(self): print("Penguin cannot fly") class Eagle(Bird): def fly(self): print("Eagle can fly very high") def bird_flying_test(bird): bird.fly() bird = Bird() penguin = Penguin() eagle = Eagle() bird_flying_test(bird) bird_flying_test(penguin) bird_flying_test(eagle)多态的优点:
提高代码的可扩展性和可维护性
提高代码复用性 使程序更易于扩展和修改
分离接口与实现
抽象类与抽象方法
抽象类:含有 抽象方法 的 类
抽象方法:函数体是空实现的(pass)
class ClassName(object): def function_one(self): pass def function_two(self): pass抽象类的核心特征:
1、必须包含抽象方法
2、不能被实例化
3、子类必须实现其抽象方法
面向对象的其它特征
类属性:
在类内部、方法外直接定义(变量名 = 值)【类内函数外】
类中所有对象共享该属性 当某一对象修改类属性时,所有对象及类本身均受影响
通过 类名.属性名 的方式访问(推荐)
对象属性:
在函数中定义:在 init 方法(也属于函数)或实例方法中通过 self. attribute的方式定义
实例属性为某个对象所独有,修改某个实例属性仅影响当前对象
通过 对象名.属性名 的方式访问(易与实例属性混淆)
类方法:
必须传入参数:第一个参数 cls(指向类本身)
装饰器:@classmethod
class ClassName(object): @classmethod def function(cls): pass静态方法:
无需固定参数
装饰器:@staticmethod
class ClassName(object): @staticmethod def function(): pass面向过程(Procedural Programming)
一种以过程(Procedure)为核心的编程范式
核心思想:自顶向下、逐步分解
核心特点:
1、以函数为基本单元
2、线性执行流程:从主函数开始,依次调用其它函数
3、数据与操作分离
4、自顶向下的设计
面向对象与面向过程的区别
面向过程:以“过程”为中心,将程序分解为一系列步骤或函数,强调“如何做”。
面向对象:以“对象”为中心,将数据和行为封装为对象,强调“谁来做”。