Python之面向对象
编程范式:面向过程编程、面向对象编程(OPP)、面向函数编程。
面向对象
- 类(Class)
- 一类拥有相同属性、方法的对象的抽象
- 对象(Object)
- 一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象
面向对象特性
- 封装
- 第一层意义:创建类和对象时,分别创建两者的名称空间。只能通过类名加“.”或者obj.的方式访问里面的名字;
- 第二层意义:类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问;
- 根据职责将属性和方法封装到一个抽象的类中
- 继承
- 一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
- 实现代码的重用,相同的代码不需要重复的编写
- 多态
- 多态不同的子类对象调用相同的父类方法,产生不同的执行结果
- 多态可以增加代码的灵活度,以继承和重写父类方法为前提是调用方法的技巧,不会影响到类的内部设计
面向对象编程
最简单的面向对象编程,self是为了给类传入参数liming:
class man(): def say(self): print("Hello!") liming = man() #类实例化成对象 liming.say() #本质上是man.say(),self接收liming
#输出
Hello!
如何给类传入参数?在类中有一个__init__函数,添加如下代码:
class man(): #man是类名 def __init__(self,name): #构造函数,在实例化时做一些类初始化的工作 self.name = name #实例变量,赋值给实例 def say(self): print("%s,say hello!" % (self.name)) liming = man("liming") liming.say() zhangsan = man("zhangsan") zhangsan.say()
#输出
liming,say hello!
zhangsan,say hello!
实例变量
self.name = name就是实例变量(静态属性),赋值给实例,作用域是实例本身。
class man(): def __init__(self,name): self.name = name
类方法
def say()就是类的方法(动态属性),类的功能。
class man(): def __init__(self,name): self.name = name def say(self): print("%s,say hello!" % (self.name))
类变量
version就是类变量,它可以不需要实例化就调用,也可以实例化进行调用。(如果出现实例与类中重名问题,先找实例变量,再找类变量)
class man(): version = "1.0.0" def __init__(self,name): self.name = name print(man.version) liming = man("liming") print(liming.version)
类变量的用途:大家共有的属性,节省内存。如果生成上千上万个实例的话,实例变量会被创建上千上万个,虽然达到的效果一样。
class man(): version = "1.0.0" def __init__(self,name,version= "1.0.0"): self.name = name
析构函数
在实例释放、销毁的时候执行的,通常用于做一些收尾工作,如关闭数据库连接、关闭打开的临时文件等。
class man(): def __del__(self): pass
私有方法与私有属性
私有:只有类中内部可以访问,外部不能访问。
不是私有属性/方法的话,外部是可以进行访问和修改的。
class man(): def __init__(self,name): self.name = name self.passwd = "123456" liming = man("liming") print(liming.passwd) liming.passwd="abc123456" print(liming.passwd) #输出 123456 abc123456
私有属性/方法在属性名/方法名前面加上__符号,不允许类外进行访问和修改,只能通过类中的函数对私有属性进行修改。
class man(): def __init__(self,name): self.name = name self.__passwd = "123456" def changepass(self,newpasswd): self.__passwd = newpasswd print(self.__passwd) liming = man("liming") #没有liming.passwd/liming.__passwd属性 #只能通过一下changepass方法来查看或修改内部属性 liming.changepass("abc123456")
#输出
abc123456