day17-1 面向对象
面向对象介绍
编程范式:编程是程序员用特定语法+数据结构、+算法 的代码来告诉计算机如何执行任务的过程。实现一个任务有许多方式,对这些不同的方式特点进行归纳总结的出来的编程方式类别称为编程范式。大多数语言只支持一种编程范式,有些语言支持多种
面向过程和面向对象是两种最重要的编程范式
面向过程 :一个procedures,一个producer包含一组被进行运算的步骤。面向过程就是程序从上到下一步步执行。但是如果这样做,问题比较明显。假如在第一步有一个方法,后面都要依赖这个方法。如果中途修改这个方法,其他步骤也得修改
所以这样维护难度,成本会比较大
面向对象 oop 编程
是通过“类”和·对象来创建各种模型实现对真实世界的描述,使用面向对象编程的原因是因为它可以使编程的维护和扩展变得更简单,并且可以大幅度提高程序开发效率。同时面向对象可以使人们更加容易理解你的代码逻辑,使团队开发更加容易
世界万物,皆可分类。世界万物,皆为对象。只要是对象,就属于某种类。只要是对象,就会有某种属性
特性
class 类
一个类即是对一类具有相同属性对象的抽象,蓝图,原型。在类中定义了这些对象都具备的属性(variables(data)),共同的方法
object 对象
一个对象即是一个类实例化后的实例。一个类可以实例化多个对象,每个对象也可以有不同的属性。
封装(Encapsulation)
在类中对数据进行赋值,内部调用对外部用户是透明的,(外部用户看不见)。这使得类容器,里面包含着·数据和方法
继承(Inheritance)
一个类可以派生出子类,在这个父类里定义的属性,方法自动被子类继承
多态(Polymorphism)
一个借口,多种实现。指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时对父类方法又做了不同的实现
函数编程与oop的主要区别就是oop可以使程序更加容易更改和扩展
类的初识:
class Role(object): # 类的定义
def __init__(self , name , role , weapon , life_value = 100 , money = 15000):
# 构造函数
#在实例化时做一些类的初始化工作
#开辟一个内存,把这些东西存入实例化对象中,比如
#r1 = Role("Richell", "police", "AK47")
#把Richell存入r1.name 可以在外部直接r1.name调用
#所以是吧变量赋值给了实例
self.name = name # 实例变量(静态属性)的作用域就是实例本身
self.roel = role
self.weapon = weapon
self.life_value = life_value
self.money = money
def shut(self): #类的方法,功能,(动态属性)
print("shutting.....")
def got_shot(self):
print("%s say 'ah.....,I got shut...terrible'" %self.name)
def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name))
r1 = Role("Richell","police","AK47") # 实例化(初始化一个类,造了一个对象),生成一个角色存入r1
r2 = Role("yang","terroist","B22") #
r1.buy_gun("加特林")
r1.shut()
r2.got_shot()
# Richell just bought 加特林
# shutting.....
# yang say 'ah.....,I got shut...terrible'
在没有实例化的时候,类已经存在了,就和函数一样,在没有调用的时候 函数体存在内存中,函数名指向函数体。
语法
属性
方法
# 类初识加强
1 class Role(object): # 类的定义 2 n = 123 #类的变量,可以直接打印,也可以通过实例打印 3 list = [] 4 print(n) 5 name = '我是类name' 6 def __init__(self , name , role , weapon , life_value = 100 , money = 15000): 7 # 构造函数 8 #在实例化时做一些类的初始化工作 9 #开辟一个内存,把这些东西存入实例化对象中,比如 10 #r1 = Role("Richell", "police", "AK47") 11 #把Richell存入r1.name 可以在外部直接r1.name调用 12 self.name = name 13 self.roel = role 14 self.weapon = weapon 15 self.life_value = life_value 16 self.money = money 17 18 def shut(self): 19 print("shutting.....") 20 21 def got_shot(self): 22 print("%s say 'ah.....,I got shut...terrible'" %self.name) 23 24 def buy_gun(self,gun_name): 25 print("%s just bought %s" %(self.name,gun_name)) 26 27 r1 = Role("Richell","police","AK47") # 实例化(初始化一个类,造了一个对象),生成一个角色存入r1 28 29 r2 = Role("yang","terroist","B22") 30 31 r1.buy_gun("加特林") 32 r1.shut() 33 r2.got_shot() 34 print(Role.n,r1.name,Role.name) 35 #添加新的的属性 36 r1.bullet_prove = True # 单独给r1 添加属性 ,就像加外挂 37 print(r1.bullet_prove) 38 39 # 删除新的属性 40 del r2.weapon 41 print(r1.weapon) 42 #print(r2.weapon) # 出错 43 44 # 改类变量 45 r1.n = 456 46 print(r1.n,r2.n) 47 print('----asdaasdas----') 48 Role.n = 'gai' 49 print(Role.n,r1.n,r2.n) # 预测结果 gai 456 gai 结果正确 50 51 # 类变量是list数据类型 52 r2.list.append('from r2') 53 r1.list.append('from r1') 54 print(r1.list) 55 print(Role.list) 56 print(r2.list) 57 # 结果 58 # ['from r2', 'from r1'] 59 # ['from r2', 'from r1'] 60 # ['from r2', 'from r1'] 61 62 63 64 # Richell just bought 加特林 65 # shutting..... 66 # yang say 'ah.....,I got shut...terrible'
构造函数
析构函数:在实例释放,销毁的时候执行,通常用于一般的收尾工作,如关闭一些数据库链接打开的临时文件
# 析构函数 def __del__(self):
1 class Role(object): # 类的定义 2 3 def __init__(self , name , role , weapon , life_value = 100 , money = 15000): 4 # 构造函数 5 #在实例化时做一些类的初始化工作 6 #开辟一个内存,把这些东西存入实例化对象中,比如 7 #r1 = Role("Richell", "police", "AK47") 8 #把Richell存入r1.name 可以在外部直接r1.name调用 9 self.name = name 10 self.roel = role 11 self.weapon = weapon 12 self.life_value = life_value 13 self.money = money 14 # 析构函数 15 def __del__(self): 16 print("%s 彻底死去。。。。" %self.name) 17 18 def shut(self): 19 print("%s shuting......" % self.name) 20 21 22 def got_shot(self): 23 print("%s say 'ah.....,I got shut...terrible'" %self.name) 24 25 def buy_gun(self,gun_name): 26 print("%s just bought %s" %(self.name,gun_name)) 27 28 r1 = Role("Richell","police","AK47") # 实例化(初始化一个类,造了一个对象),生成一个角色存入r1 29 r2 = Role("yang","terroist","B22") 30 r1.buy_gun("加特林") 31 r1.shut() 32 del r2 33 print(r1.name) 34 35 # 在整个程序结束的时候实例化的类会自动销毁,因此会自动执行析构函数。记住这里是程序结束,python是从上到下解释的语句。所以一直不会销毁。除非在程序里面删除变量名 36 37 #r2.got_shot() # 出错,r2被消除,同时析构函数会在程序结束时执行,或者使用del 的时候 38 39 # 40 # Richell just bought 加特林 41 # Richell shuting...... 42 # yang 彻底死去。。。。 43 # Richell 44 # Richell 彻底死去。。。。
私有方法,私有属性(封装):
1 class Role(object): # 类的定义 2 3 def __init__(self , name , role , weapon , life_value = 100 , money = 15000): 4 # 构造函数 5 #在实例化时做一些类的初始化工作 6 #开辟一个内存,把这些东西存入实例化对象中,比如 7 #r1 = Role("Richell", "police", "AK47") 8 #把Richell存入r1.name 可以在外部直接r1.name调用 9 self.name = name 10 self.roel = role 11 self.weapon = weapon 12 self.__life_value = life_value # 私有属性 不能被外界访问。如果非要访问,也是可以的 13 self.money = money 14 15 def get_life(self): 16 print("%s life_value is %d" %(self.name,self.__life_value)) 17 def __shut(self): # 私有方法 18 print("%s shuting......" % self.name) 19 20 21 def got_shot(self): 22 print("%s say 'ah.....,I got shut...terrible'" %self.name) 23 24 def buy_gun(self,gun_name): 25 print("%s just bought %s" %(self.name,gun_name)) 26 def get_fun(self): 27 self.__shut() 28 29 r1 = Role("Richell","police","AK47") # 实例化(初始化一个类,造了一个对象),生成一个角色存入r1 30 r2 = Role("yang","terroist","B22") 31 r1.buy_gun("加特林") 32 #r1.__shut() # 直接访问私有方法报错 33 # print(r1.__life_value) # 报错 34 35 # 访问私有属性的两种正确方法 36 r1.get_life() #访问私有属性 37 print(r1._Role__life_value) # 不能在外部访问私有属性的原因是因为python解释器把私有属性的名字改变了。名字格式是 '实例化名'+'.'+'_类名'+'私有属性名' 38 # 访问私有变量 39 r1.get_fun() #通过内部方法 40 r1._Role__shut() 41 42 #私有属性和私有方法都是在函数名前面加两个 _ .但python不会完全禁止你访问
类变量:大家共用的数据或者属性。作用与实例变量中的默认变量差不多。但是如果是大规模的实例额,对于大家公用的属性使用类变量会节省开销
实例变量:描述具体实例的属性