类与对象的关系
类: 就是创建对象的第一步,先写类
对象: 通过类来创建对象
类是对某事物的归类(类就是对属性和方法的封装)
__init__(self, 参数): 参数一般作为属性设置给对象,对象就是self,对属性的封装,(根据需要,如果在类中传参就用__init__,如果不需要传参,就直在类里定义函数即可)
def 方法(self, 参数): 方法,第一个参数一般是固定的self,当前类的对象
创建类:
class 类名:
对象是某类型的一个具体
创建对象:
变量 = 类名() #实例化 <-> 创建对象
变量.属性 #访问对象的属性信息
变量.方法() #访问类中的方法
class 类名: def __init__(self,值1,值2): # __init__(初始化方法,又被成为构造方法) self.属性 = 值1 self.属性 = 值2 def 方法(self): 方法体 def 方法2(self): 方法体2 对象名 = 类名(值1,值2) 对象名.方法() 对象名.方法2()
创建类
class Car: #类名首字母大写,严格遵守变量命名规则 pass c = Car() #创建对象,对象名=类名() c.color = '红色' # 对象.属性(.意思就是'的')当属性不存在的时候,添加一个属性 c.pai = '京A88888' c.color = '黑色' # 当属性存在的时候是修改属性信息(类似于字典根据key修改value) print(c.color) print(c.pai) 结果 红色 黑色 京A88888
创建一个类并调用这个类
__init__方法是一个特殊的方法,初始化方法(构造方法),在创建对象的时候,默认执行这个函数
在创建对象的时候会自动的调用__init__()
self就是创建出来的对象
class Car: def __init__(self,color,pai): self.a = color self.pai = pai def pao(self): #在类中写的函数就是方法,self当前类的对象 print('我%s的%s车能跑'%(self.a,self.pai)) def jump(self): print('我的%s车能飞'%self.pai) c=Car('红色','京A88888') # 创建Car类型对象,self参数不需要管 c.pao() c.jump() c2 = Car('黑色','京B66666') c2.pao() c2.jump() 结果 我红色的京A88888车能跑 我的京A88888车能飞 我黑色的京B66666车能跑 我的京B66666车能飞 事例2,对象传参 class Car: def __init__(self,color,pai): self.a = color self.pai = pai def pao(self,ret): print('我%s的%s车能跑%s'%(self.a,self.pai,ret)) def jump(self): print('我的%s车能飞'%self.pai) c=Car('红色','京A88888') c.pao('太空') c.jump() 结果 我红色的京A88888车能跑太空 我的京A88888车能飞 练习 用向对象的思维来模拟LOL里的盖伦上阵杀敌 class Hero: def __init__(self,name,nickname): self.name = name self.nickname = nickname def synopsis(self): print('%s外号%s'%(self.name,self.nickname)) def q(self): print('拎着大宝剑嗷嗷跑') def w(self): print('护盾') def r(self): print('大宝剑') gw = Hero('盖伦','德玛西亚之力') gw.synopsis() gw.q() gw.w() gw.r() 结果 盖伦外号德玛西亚之力 拎着大宝剑嗷嗷跑 护盾 大宝剑 用向对象的思维来完成用户登录 class People: def __init__(self,user,pwd): self.user = user self.passwd = pwd def login(self): use = input('user:') password = input('passwd:') if use == self.user and password == self.passwd: print('登陆成功') else: print('登陆失败') Lgin = People('bob','123') Lgin.login()
面向对象和面向过程对比
脚本:(简单)
一切以事务的发展流程为中心
根据业务逻辑从上到下写垒代码
print('开冰箱门') print('装大象') print('关闭冰箱')
函数式(比脚本麻烦)
将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
def kai(): print('开冰箱门') def zhuang(): print('装大象') def guan(): print('关闭冰箱') kai() zhuang() zhuang() guan()
面向对象:
一切以对象为中心,一切皆为对象,具体的某一个事务就是对象
对函数进行分类和封装,让开发"更快更好更强..."
对整个系统进行分析,分析出需要哪些对象,然后给对象进行归类
先写类,然后使用类创建对象,最后用对象去执行相关的操作
class Elephant: def __init__(self): print('创建大象') def kai(self): print('开冰箱门') def zhuang(self): print('装大象') def guan(self): print('关闭冰箱') e = Elephant() e.kai() e.zhuang() e.guan()
总结
脚本简单,不需要构思整个程序的概况
函数侧重的是功能,对功能有了概况
面向对象侧重的是归类
面向过程: 代码非常的冗余. 尤其是参数
面向对象的程序:
优点: 不需要像原来一样传递同样的参数了,结果相对清晰,可维护性好
缺点: 代码量比原来大,上手太难
应用场景:
如果写一些比较小的程序用面向过程
程序很复杂,很庞大建议用面向对象
python同时支持面向对象和面向过程:
面向过程: 应用程序相对比较小,不需要大规模的设计
面向对象: 程序非常大,项目管理维护成本很高,此时更适合用面向对象(结构)
封装
1. 对属性的封装
2. 对功能的封装
3. 模块的封装
4. 包的封装
class Game: def login(self): print("登录") def recharge(self): print("充钱") def uninstall(self): print("卸载") def zhaoduixiang(self): print("找对象") class Game1: def recharge(self): print("充钱") def uninstall(self): print("卸载") class Game2: def recharge(self): print("充钱") def uninstall(self): print("卸载") g = Game2() g.uninstall() 结果 卸载
继承
子类自动拥有父类中除了私有内容外的其他所有内容
继承目的: 对父类进行扩展
class Foo: def getmoney(self): print('多花钱') class Bar(Foo): pass b = Bar() b.getmoney() 结果 多花钱 事例2 class Animal: def dong(self): print('动物会叫') class Cat(Animal): def an(self): print('猫捉老鼠') c = Cat() c.dong() c.an() #子类可以执行子类和父类中的方法 c = Animal() #父类的对象不能执行子类中的功能 c.dong() # c.an() # 创建的是Animal,所以不能执行子类中的方法 事例3 class Animal: def dong(self): print('动物会叫') class Cat(Animal): # 子类其实是对父类的一种扩展 def dong(self): # 子类中写了和父类一模一样的方法. 这个叫方法的覆盖, 重写 print('猫捉老鼠') def cat(self): print('猫上蹿下跳') c = Cat() c.dong() # 类中的方法的查询顺序,先找自己,然后再找父类 结果 猫捉老鼠 python支持多继承 class Foo1: def dong(self): print('动物会叫') def cat(self): print('猫上蹿下跳') class Foo2: def dong(self): print('猫捉老鼠') class Bar(Foo2,Foo1): #哪个类在前优先使用哪个类 pass b = Bar() # 就近原则 b.dong() 结果 猫捉老鼠
多态(同一个对象. 多种形态)
优点:超强的可扩展性,面向对象的核心就是多态
class Animal: def chi(self): print("会吃") class Tiger(Animal): def chi(self): print("老虎吃肉") class Elephant(Animal): def chi(self): print("大象吃香蕉") def wei_animal(ani): ani.chi() t = Tiger() e = Elephant() wei_animal(t) wei_animal(e) 结果 老虎吃肉 大象吃香蕉