zoukankan      html  css  js  c++  java
  • python笔记 第十一天 面向对象

    概述    

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

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

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

    类的定义

    类定义,像函数定义一样,在执行时才会起作用。你可以把类定义放在任何地方比如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 = sex
    
    obj1 = foo("hairui",25)
    #执行时,self 就是obj1
    obj2 = foo("zjw",20)
    #执行时,self 就是obj2
    
    print("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 就是obj1
    obj2 = foo("zjw",20)
    #执行时,self 就是obj2
    
    obj1.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:
        pass
    
    class 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 “鸭子类型”
  • 相关阅读:
    解决xcode5升级后,Undefined symbols for architecture arm64:问题
    第8章 Foundation Kit介绍
    app 之间发送文件 ios
    iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
    CRM下载对象一直处于Wait状态的原因
    错误消息Customer classification does not exist when downloading
    How to resolve error message Distribution channel is not allowed for sales
    ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
    有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
    SAP GUI和Windows注册表
  • 原文地址:https://www.cnblogs.com/liuyang1987/p/6201702.html
Copyright © 2011-2022 走看看