简介
三中编程范式
面向过程编程
函数式编程
面向对象编程
面向对象和面向过程对比
面向过程
优点:
性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:
没有面向对象易维护、易复用、易扩展
面向对象
优点:
易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 - 缺点:
性能比面向过程低
定义
类(Class)
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
函数属性
即函数,在面向对象里统称为方法
数据属性
即变量,类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量
定义在方法中的变量,只作用于当前实例的类。
封装
描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。
继承
即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化
创建一个类的实例,类的具体对象。
方法
类中定义的函数。
对象
通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
示例
声明类示例
class 类名(可选参数):
["注释"]
类体
数据&函数属性调用
class Text:
'''这是一个测试的类!'''
a = '测试'
def test():
print("这是一个测试函数(方法)!")
print(Text.a)
Text.test()
print(dir(Text)) #查看属性名称
print(Text.__dict__) #查看类属性的字典
测试
这是一个测试函数(方法)!
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'test']
{'__module__': '__main__', '__doc__': '这是一个测试的类!', 'a': '测试', 'test': , '__dict__': , '__weakref__': }
初始化函数
class Text:
'''这是一个测试的初始化函数!'''
def __init__(self,name,age,gender):
self.a = name
self.b = age
self.c = gender
v = Text("小明","18岁","男") #实例化生成的对象
print(v.__dict__) #生成对应的字典
print(v.a,v.b,v.c) #字典取值
封装
==即把代码隐藏起来,并非真正隐藏,而是一种使用接口调用“隐藏”类的约定==
隐藏调用,_开头的函数
class Test:
_num = "this is test!!!"
P = Test()
print(P._num)
隐藏调用,__开头的函数
class Test:
__num = "this is test!!!"
P = Test()
print(P._Test__num)
增删改查
==注:类底层以字典形式记录保存数据,切勿以字典形式修改数据==
数据属性增删改查
# -*- coding:utf8 -*-
class Obj:
mold='动物'
def __init__(self,name):
self.name = name
def play_ball(self,ball):
print('%s是一个%s' %(self.name,ball))
print(Obj.mold) #查看
Obj.mold = '植物' #修改
print(Obj.mold) #显示修改后内容
Obj.aquatic = "水产" #增加
print(Obj.aquatic) #显示增加后的内容
del Obj.aquatic #删除
动物
植物
水产
函数属性增删改查
# -*- coding:utf8 -*-
class Obj:
mold='动物'
def __init__(self,name):
self.name = name
def play_ball(self,ball):
print('%s是一个%s' %(self.name,ball))
def test():
print("This is test !!!")
def test2():
print("My test2 !!!")
Obj.add_test =test #新增
print(Obj.__dict__) #确认是否加入类
Obj.add_test() #查看
Obj.play_ball = test2 #修改
Obj.play_ball() #修改后查看确认
del Obj.add_test #删除
{'__module__': '__main__', 'mold': '动物', '__init__': , 'play_ball': , '__dict__': , '__weakref__': , '__doc__': None, 'add_test': }
This is test !!!
My test2 !!!
实例属性增删改查
# -*- coding:utf8 -*-
class Obj:
mold='动物'
def __init__(self,name):
self.name = name
def play_ball(self,ball):
print('%s是一个%s' %(self.name,ball))
def test():
print("This is test !!!")
def test2():
print("My test2 !!!")
P = Obj('小猫') #生成实例
P.play_ball('钓鱼') #执行查看
P.address = '河边' #实例增加数据属性
print(P.__dict__) #查看实例增加的数据属性
print(P.address)
P.test = test #实例增加函数属性
print(P.__dict__) #查看示例增加的函数属性
print(P.test)
P.test() #执行测试
小猫是一个钓鱼
{'name': '小猫', 'address': '河边'}
河边
{'name': '小猫', 'address': '河边', 'test': }
This is test !!!
特殊类属性
名称
释义
Class.__name__
类的名字
Class.__doc__
类的文档(声明注释内容)
Class.__base__
类的第一个父类
Class.__bases__
类的所有弗雷构成的元组
Class.__dict__
类的属性
Class.__module__
类定义所在的模块
Class.__class__
示例对应的类
面向对象设计
数据类型余动作的结合
# -*- coding:utf8 -*-
def production(name,addr,type): #函数定义的类型
def eat(obj): #函数定义的动作1
print('在%s有一个%s的%s' %(obj['addr'],obj['type'],obj['name'])) #输出项目内容,以字典形式传值,接受项也需要是字典
def play(obj): #函数定义的动作2
print('%s正在%s%s' %(obj['name'],obj['addr'],obj['type'])) #输出项目内容,以字典形式传值,接受项也需要是字典
def init(name,addr,type): #初始化函数把动作和类型放置一起
obj_dic = { #定义的包含动作和类型的字典
'name':name,
'addr':addr,
'type':type,
'eat':eat,
'play':play
}
return obj_dic #返回动作和类型的字典
return init(name,addr,type) #返回动作和类型的对象
s1 = production('小猫','河边','钓鱼') #生产测试
print(s1) #生产类型,输出包含动作和类型的的项目字典
s1['play'](s1) #总体执行,包含动作和类型,嵌套函数以字典传值所以函数参数为原函数执行的字典结果
{'name': '小猫', 'addr': '河边', 'type': '钓鱼', 'eat': .eat at 0x0000024E1B3C41E0>, 'play': .play at 0x0000024E1B3C42F0>}
小猫正在河边钓鱼
面向对象编程
面向对象编程独有语法去实现面向对象设计
# -*- coding:utf8 -*-
class Test: #定义类的类型
def eat(obj): #函数定义的动作1
print('在%s有一个%s的%s' %(s1.b,s1.c,s1.a)) #输出项目内容,从初始化函数中调用
def play(obj): #函数定义的动作2
print('%s正在%s%s' %(s1.a,s1.b,s1.c)) #输出项目内容,从初始化函数中调用
def __init__(self,name,addr,type): #初始化函数
self.a = name
self.b = addr
self.c = type
s1 = Test('小猫','河边','钓鱼') #生产测试
print(s1) #生产类型,输出实例化对象
s1.play() #总体执行,包含动作和类型
小猫正在河边钓鱼