面向对象
面向对象编程:OOP是利用“类”和“对象”来创建各种模型开实现对现实世界的描述,使用面向对象编程的原因一方面是因为他可以使程序的维护性和扩展性变得简单,并且可以大大提高程序开发效率,另外,基于面向对象的程序可以使他人更加容易理解代码逻辑,从而使团队开发变得更从容。
面向对象的核心特性:
Encapsulation封装
在类中对数据的赋值、内部调用对外部是透明的,这使类变成一个容器,里面包含着类的数据和方法。
Class类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类种定义了这些对象都具备的属性、共同方法。
Object对象
一个对象是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象可以有不同的属性,就像人类指所有人,每个人是指具体的对象,人与人之间有共性,也有区别。
Inheritance继承
一个类可以派生出子类,在这个父类定义的属性、方法自动被子类继承。
Polymorphism多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,是指一个基类中派生出不同的子类,而且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一事物表现出的多种形态。
类的定义
class Person:
def __init__(self,name,age):#初始化,__init__ 双下划线魔法函数
self._name = name #_name表明该属性为私有属性
self._age = age
def getName(self):#self是每个实例本身
return self._name
def rename(self,new_name):
self._name = new_name
初始化函数中,self后面的实例化对象的属性,_name加下划线代表该属性为私有属性,外部不应该访问
p = Person('Wang',18)
p
输出:<__main__.Person at 0x104cb77f0>
p.getName()
输出:'Wang'
p.rename("Wang x")
p.getName()
输出:'Wang x'
类的继承
class Student(Person): #继承Person类
pass #pass代表什么都不做
def setScore(self,score):
self._score = score
def getScore(self):
return self._score
子类继承父类后,子类能够访问父类的属性和方法,子类可以声明自己的方法和属性
s = Student("liu",18)
s.getName() #父类的方法
输出:'liu'
s.rename("liu haoran") #父类的方法
s.getName() #父类的方法
输出:'liu haoran'
s.setScore(100) #子类的方法
s.getScore()
输出:100
类的属性
类的静态属性使用 @property来修饰(装饰器)
class Person:
def __init__(self,name,age):#初始化,__init__ 双下划线魔法函数
self._name = name #_name表明该属性为私有属性
self._age = age
def getName(self):#self是每个实例本身
return self._name
def rename(self,new_name):
self._name = new_name
@property #使用property关键字来修饰,name则为Person的属性
def name(self):
return self._name
使用property关键字来修饰,name则为Person的属性 ,可以直接用p.name来访问该属性
p = Person('Wang',18)
p.name #使用点语法来访问类的属性
输出:'Wang'
类的动态属性即是类的方法
class Person:
def __init__(self,name,age):#初始化,__init__ 双下划线魔法函数
self._name = name #_name表明该属性为私有属性
self._age = age
def eatFood(self):#self是每个实例本身
print("吃东西")
析构函数
在实例释放、销毁时执行,通常用于做一些收尾工作。
class Person:
def __init__(self,name,age):#初始化,__init__ 双下划线魔法函数
self._name = name #_name表明该属性为私有属性
self._age = age
def __del__(self):
print("对象销毁")