面向对象
1、面向对象与面向过程
面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么
基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式
优点:复杂的过程流程化
缺点:扩展性差
面向对象:核心是对象二字,对象指特征与技能的结合体
基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是 一种‘上帝式’的思维方式
优点:可扩展性强
缺点:变成复杂度高,极容易出现过度设计的问题
2、类
对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
在现实生活中:一定是先有一个个具体的对象,后总结出类
在程序中:一定是先定义类,后产生对象
#创建类的成员并访问
# class aaa: #定义类 # '''大雁类''' #类文本字符串 # def __init__(self,beak,wing,claw): #构造方法 # print('我是大雁类!') # print(beak) # print(wing) # print(claw) #输出特征 # def fly(self,state = "i can fly"): # print(state) # beak_1="嘴的基部较高,长度和头部的长度几乎相等" # wing_1="翅膀长而尖" # claw_1="爪子是什么什么的" #特征 # bbb = aaa(beak_1,wing_1,claw_1) #创造大雁类的实例 # bbb.fly() # bbb.fly("我飞行的时候,一会排成个人字,一会排成个一字")
#创建数据成员并访问
# class Geese: # '''雁类''' # neck = "脖子较长" # wing = "振翅膀频率高" # leg = "腿位于身体的中心支点,行走自如" #类属性 # number = 0 #编号 # def __init__(self): # Geese.number +=1 # print("\n我是第" + str(Geese.number) +"只大雁,我属于雁类!我有以下特征:") # print(Geese.neck) # print(Geese.wing) # print(Geese.leg) #输出特征 # #创建4个雁类的对象(相当与有5只大雁) # l = [] # for i in range(5): #循环5次 # l.append(Geese()) #创建一个雁类实例 # print("一共有"+str(Geese.number)+"只大雁")
# #实例属性
# class Geese: # '''雁类''' # def __init__(self):#实例方法(相当于构造方法) # self.neck = "脖子较长" # self.wing = "振翅频率高" # self.leg = "腿位于身体的中心支点,行走自如" #定义实例属性 # print("我属于雁类! 我有以下特征:") # print(self.neck) # print(self.wing) # print(self.leg) #输出特征 # geese = Geese()
#修改
# class Geese: # '''雁类''' # def __init__(self): # self.neck = "脖子加长" # print(self.neck) # g1 = Geese() # g2 = Geese() # g1.neck = "脖子没有天鹅的长" #修改实例的属性 # print('g1的neck属性:',g1.neck) # print('g2的neck属性:',g2.neck)
#访问限制
# class Swan: # '''天鹅类''' # __neck_swan = '天鹅的脖子很长' #定义私有属性 # def __init__(self): # print('__init__():',Swan.__neck_swan) #在实例方法中访问私有属性 # swan = Swan() #创建Swan类的实例 # print('加入类名:',swan._Swan__neck_swan) #私有属性,可以通过”实例名._类名__xxx“方式访问
# class Swan: # '''天鹅类''' # __neck_swan = '天鹅的脖子很长' #定义私有属性 # def __init__(self): # print('__init__():',Swan.__neck_swan) #在实例方法中访问私有属性 # swan = Swan() #创建Swan类的实例 # print('直接访问:',Swan.__neck_swan) #私有属性不能通过实例名访问