python初识面向对象

类与对象的关系
类: 就是创建对象的第一步,先写类
对象: 通过类来创建对象

类是对某事物的归类(类就是对属性和方法的封装)
    __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)
结果
老虎吃肉
大象吃香蕉

 

posted @ 2018-12-30 15:33  清茶i  阅读(133)  评论(0编辑  收藏  举报