博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python笔记 第十一天 面向对象
阅读量:6703 次
发布时间:2019-06-25

本文共 4436 字,大约阅读时间需要 14 分钟。

概述    

    面向过程:根据业务逻辑从上到下写垒代码

    函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

    面向对象:对函数进行分类和封装,让开发“更快更好更强...”

类的定义

类定义,像函数定义一样,在执行时才会起作用。你可以把类定义放在任何地方比如if语句的分支,或者在函数内部。 在实际应用时,定义在类中的语句通常都是函数定义,但是其它语句也是允许出现的,并且有的时候非常有用。 当进入一个类定义时,一个新的名称空间被创建,并且被当作局部域来使用。

类的书写格式

关键字为:class 

创建对象,类名称后加括号即可

271420286872390.jpg

注:执行方法必须是  obj = foo()  创建一个对象   再用对象执行内方法,如:ret = obj.start()

 

class line:    def __init__(self, data):#构造方法        try:            p = int(data)        except Exception as e:            p = 1        self.p = int(p)    def start(self):#方法        ret = (self.p - 1) * 10        return ret    def end(self):#方法        ret = self.p * 10        return ret

特殊方法*

    构造方法

     __init__,默认对象调用类的时候,会执行init方法,创建基础值,

class game:    foo =  100#字段    blue = 100    sjjy = 100    money = 0    def __init__(self, name, sex="男"):#创建基础信息        '''        构造方法 创建人物信息        :param name:        :param sex:        '''        self.name = name  # 昵名        self.sex = sex  # 性别        self.leves = 1  # 等级        self.gjl = 10  # 攻击力        self.foo = 100  # 血        self.foosj = 100  # 升级后的最大血量        self.blue = 100  # 蓝        self.bluesj = 100  # 升级后最大蓝量        self.jinyan = 0  # 当前经验值        self.sjjy = 100  # 升级所需要的经验        self.money = 0  # 用户金额#本段代码来自 海瑞博客http://www.hairuinet.com/post/44.html

       注:obj = 类()就会执行构造方法

三大特性

    1.封装

        封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

        所以,在使用面向对象的封装特性时,需要:将内容封装到某处,使用时从某处调用被封装的内容

    直接调用案例:

 

class foo:    def __init__(self,name,age,sex="男"):        self.name = name        self.age = age        self.sex = sexobj1 = foo("hairui",25)#执行时,self 就是obj1obj2 = foo("zjw",20)#执行时,self 就是obj2print("obj1的姓名:%s,年龄:%s,性别:%s"%(obj1.name,obj1.age,obj1.sex))print("obj2的姓名:%s,年龄:%s,性别:%s"%(obj2.name,obj2.age,obj2.sex))#obj1的姓名:hairui,年龄:25,性别:男#obj2的姓名:zjw,年龄:20,性别:男
class foo:    def __init__(self,name,age,sex="男"):        self.name = name        self.age = age        self.sex = sex    def show(self):        print("%s的姓名:%s,年龄:%s,性别:%s"%(self,self.name,self.age,self.sex))obj1 = foo("hairui",25)#执行时,self 就是obj1obj2 = foo("zjw",20)#执行时,self 就是obj2obj1.show()obj2.show()# <__main__.foo object at 0x102185320>的姓名:hairui,年龄:25,性别:男# <__main__.foo object at 0x102185358>的姓名:zjw,年龄:20,性别:男

     综上所述,对于封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

    2.继承

            1.继承父类,子承父业

            案例:

              猫可以:喵喵叫、吃、喝、拉、撒

              狗可以:汪汪叫、吃、喝、拉、撒

class zoon:    def eat(self):        print("%s吃粮" % self.name)    def drink(self):        print("%s喝水" % self.name)    def la(self):        print("%s拉set" % self.name)    def sha(self):        print("%s潵野" % self.name)class cat(zoon):    def __init__(self,name):        self.name = name    def cry(self):        print("%s喵喵叫" % self.name)class dog(zoon):    def __init__(self,name):        self.name = name    def cry(self):        print("%s汪汪叫" % self.name)cat1 = cat("二黑")cat1.drink()cat1.cry()dog1 = dog("旺旺")dog1.drink()dog1.cry()

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

        2.重写

class f:    def f1(self): print("i am f1") def f2(self): print("i am f2") class s(f):#继承 def s1(self): print("i am s1") def f2(self):#重写父类方法 super(s,self).f2()#推荐使用。使用父类的方法 print("i am s.f2") f.f2(self)#使用父类的方法 obj = s() obj.s1() obj.f2()

super(派生类,self).基类方法()派生类方法中使用基类方法,推荐使用,可读性强

基类.基类方法(派生类的self) 同上,不推荐使用

    3.多继承

        Python的类可以继承多个类,Java和C#中则只能继承一个类

        Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先

        111.jpg

        当类是经典类时,多继承情况下,会按照深度优先方式查找

        当类是新式类时,多继承情况下,会按照广度优先方式查找

 

经典类

 

class D:    def bar(self):        print 'D.bar'class C(D):    def bar(self):        print 'C.bar'class B(D):    def bar(self):        print 'B.bar'class A(B, C):    def bar(self):        print 'A.bar'a = A()# 执行bar方法时# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错# 所以,查找顺序:A --> B --> D --> C# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了a.bar()经典类多继承

新式类

 

class D(object):    def bar(self):        print 'D.bar'class C(D):    def bar(self):        print 'C.bar'class B(D):    def bar(self):        print 'B.bar'class A(B, C):    def bar(self):        print 'A.bar'a = A()# 执行bar方法时# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错# 所以,查找顺序:A --> B --> C --> D# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了a.bar()新式类多继承

     3.多态

Python 原生就是多态,无须关注过多

崇尚鸭子类型

 

class F1:    passclass S1(F1):    def show(self):        print 'S1.show'class S2(F1):    def show(self):        print 'S2.show'def Func(obj):    print obj.show()s1_obj = S1()Func(s1_obj) s2_obj = S2()Func(s2_obj) Python “鸭子类型”

 

转载于:https://www.cnblogs.com/liuyang1987/p/6201702.html

你可能感兴趣的文章
OA系统权限管理设计方案
查看>>
TI C66x DSP 系统events及其应用 - 5.11(中断控制寄存器)
查看>>
《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录
查看>>
『Scrapy』全流程爬虫demo
查看>>
Android跳转到系统Wifi界面的方式
查看>>
细说业务逻辑 -- 丢失的业务逻辑层
查看>>
阿里云自动快照有什么用,如何设置?
查看>>
xshell 与 putty
查看>>
Oracle用户、权限、角色管理
查看>>
2. Ext中关于Ext.QuickTips.init()的使用
查看>>
SIGTERM等信号含义【转】
查看>>
剑指offer三十六之两个链表的第一个公共结点
查看>>
hadoop之 Hadoop 2.x HA 、Federation
查看>>
spring-boot-starter-data-redis与spring-boot-starter-redis两个包的区别
查看>>
Django And Django-Rest-Framework 异常记录
查看>>
MLP(多层神经网络)介绍
查看>>
[原创]用C#实现微信“跳一跳”小游戏的自动跳跃助手
查看>>
测试日报模板
查看>>
GDALBuildVRT异构波段的支持
查看>>
Windows7-32位系统下R语言链接mySQL数据库步骤
查看>>