zoukankan      html  css  js  c++  java
  • python --- 面向对象

    一 . 函数编程和面向对象的对比

      1. round 1 请开发一个消息提醒功能(邮件/短信/微信)

        函数 :

    def email(em,text):
        """
        发送邮件
        :return:
        """
        print(em,text)
    
    def msg(tel,text):
    """
        发送短信
        :return:
        """
        print(tel,text)
    
    def wechat(num,text):
        """
        发送微信
        :return:
        """
        print(num,text)
    
    
    # 编写功能:假设用户购买课程,然后给alex发送提醒;
    if 1==1:
        msg('188888888','张进购买了一个学位课')
        email('alex@sb.com','张进购买了一个学位课')
        wechat('xxxx','张进购买了一个学位课')

        面向对象 : 

    class Message:
        def email(self, em, text):
            """
            发送邮件
            :return:
            """
            print(em,text)
    
        def msg(self, tel, text):
            """
            发送短信
            :return:
            """
            print(tel,text)
    
        def wechat(self, num, text):
            """
            发送微信
            :return:
            """
            print(num,text)
    
    
    # 编写功能:假设用户购买课程,然后给alex发送提醒;
    if 1==1:
        obj = Message()
        obj.email('alex@sb.com', '张进购买了一个学位课')
        obj.msg('188888888','张进购买了一个学位课')
        obj.wechat('xxxx','张进购买了一个学位课')
    对比:
    函数:定义简单/调用简单
    面向对象:定义复杂/调用复杂 好处:归类,将某些类似的函数写在一起

    总结:
    1. 函数式编程可能会比面向对象好.
    2. Python中支持两种编程方式.
    3. 面向对象方式格式:
    定义:
          class 类名:              - 定义了一个类
             
             def 函数名(self):    - 在类中编写了一个"方法"
                pass 
       调用:
          x1 = 类名()              - 创建了一个对象/实例化一个对象
          x1.函数名()               - 通过对象调用其中一个方法.
          
    4. 示例:
       class Account:
          def login(self):
             user = input('请输入用户名:')
             pwd = input('请输入密码:')
             if user == 'alex' and pwd == 'sb':
                print('登录成功')
             else:
                print('登录失败')
    
       obj = Account()
       obj.login()

      2 . round 2 打印

    """
    完成以下功能:
        老狗/20岁/男/上山去砍柴
        老狗/20岁/男/开车去东北
        老狗/20岁/男/喜欢大宝剑
    """
    
    # ##################### 函数版本 #########################
    """
    def kc(name,age,gender):
        data = "%s,性别%s,今年%s岁,喜欢上山砍柴" %(name,gender,age)
        print(data)
    
    def db(name,age,gender):
        data = "%s,性别%s,今年%s岁,喜欢开车去东北" %(name,gender,age)
        print(data)
    
    def bj(name,age,gender):
        data = "%s,性别%s,今年%s岁,喜欢大宝剑" %(name,gender,age)
        print(data)
    
    
    kc('老狗',20,'男')
    kc('老狗',20,'男')
    db('老狗',20,'男')
    bj('老狗',20,'男')
    """
    # ##################### 面向对象 #########################
    class LaoGou:
    
        def __init__(self,name,age,gender): # 特殊的方法,如果 类名() ,则该方法会被自动执行 (构造方法)
            self.n1 = name
            self.n2 = age
            self.n3 = gender
    
        def kc(self):
            data = "%s,性别%s,今年%s岁,喜欢上山砍柴" %(self.n1,self.n3,self.n2)
            print(data)
    
        def db(self):
            data = "%s,性别%s,今年%s岁,喜欢开车去东北" %(self.n1,self.n3,self.n2)
            print(data)
    
        def bj(self):
            data = "%s,性别%s,今年%s岁,喜欢大宝剑" %(self.n1,self.n3,self.n2)
            print(data)
    
    obj = LaoGou('老狗',20,'')
    obj.kc()
    obj.db()
    obj.bj()

        总结 :

          1.构造方法 :

    # 示例一:
    class Foo:
        
        def __init__(self,name):     #构造方法,目的进行数据初始化.
            self.name = name 
            self.age = 18 
    
    obj = Foo('侯明魏')
    
    #通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可.
    
    # 示例二:    
    class Bar:
        pass 
    obj = Bar()

          2.应用 :

            a . 将数据封装到对象中,以供自己在方法中调用

    class FileHandler:
        def __init__(self,file_path):
            self.file_path = file_path
            self.f = open(self.file_path, 'rb')
    
        def read_first(self):
            # self.f.read()
            # ...
            pass
    
        def read_last(self):
            # self.f.read()
            # ...
            pass
    
        def read_second(self):
            # self.f.read()
            # ...
            pass
        
    obj = FileHandler('C:/xx/xx.log')
    obj.read_first()
    obj.read_last()
    obj.read_second()
    obj.f.close()

            b . 将数据封装到对象中,以供其他函数调用

    def new_func(arg):
        arg.k1
        arg.k2
        arg.k6
    
    class Foo:
        def __init__(self,k1,k2,k6):
            self.k1 = k1
            self.k2 = k2
            self.k6 = k6
    
    obj = Foo(111,22,333)
    new_func(obj)
    练习: 信息管理系统
    1. 用户登录
    2. 显示当前用户信息
    3. 查看当前用户所有的账单
    4. 购买姑娘形状的抱枕
    class UserInfo:
    
        def __init__(self):
            self.name = None
    
        def info(self):
            print('当前用户名称:%s' %(self.name,))
    
        def account(self):
            print('当前用户%s的账单是:....' %(self.name,))
    
        def shopping(self):
            print('%s购买了一个人形抱枕' %(self.name,))
    
        def login(self):
            user = input('请输入用户名:')
            pwd = input('请输入密码:')
            if pwd == 'sb':
                self.name = user
                while True:
                    print("""
                        1. 查看用户信息
                        2. 查看用户账单
                        3. 购买抱枕
                    """)
                    num = int(input('请输入选择的序号:'))
                    if num == 1:
                        self.info()
                    elif num ==2:
                        self.account()
                    elif num == 3:
                        self.shopping()
                    else:
                        print('序号不存在,请重新输入')
            else:
                print('登录失败')
    
    obj = UserInfo()
    obj.login()

        总结 :

    class Foo:
        def func2(self):
            print('func2')
        
        def func1(self):
            self.fun2()
            print('func1')
            
            
    obj = Foo()
    obj.func1()

    二 . 面向对象代码如何编写

      1.规则

    class Foo:
        
        def __init__(self,name):
            self.name = name 
            
            
        def detail(self,msg):
            print(self.name,msg)
            
    obj = Foo()
    obj.detail()

      2.什么时候写?如何写?

        方式一 : 归类 + 提取公共值

          归类 :

    class File:
        def file_read(self,file_path):
            pass
    
        def file_update(self,file_path):
            pass
    
        def file_delete(self,file_path):
            pass
    
        def file_add(self,file_path):
            pass
    
    class Excel:
        def excel_read(self,file_path):
            pass
    
        def excel_update(self,file_path):
            pass
    
        def excel_delete(self,file_path):
            pass
    
        def excel_add(self,file_path):
            pass

          提取公共值 :

    class File:
        def __init__(self,file_path):
            self.file_path = file_path
            
        def file_read(self):
            pass
    
        def file_update(self):
            pass
    
        def file_delete(self):
            pass
    
        def file_add(self):
            pass
    
    class Excel:
        def __init__(self,file_path):
            self.file_path = file_path
            
        def excel_read(self):
            pass
    
        def excel_update(self):
            pass
    
        def excel_delete(self):
            pass
    
        def excel_add(self):
            pass

        方式二 : 在指定类中编写和当前类相关的所有代码 + 提取公共值

    class Message:
        def email(self):    
            pass 
    
    class Person:
        def __init__(self,na, gen, age, fig)
            self.name = na
            self.gender = gen
            self.age = age
            self.fight =fig
            
        def grassland(self):    
            self.fight = self.fight - 10  
            
        def practice(self):
            self.fight = self.fight + 90   
            
        def incest(self):
            self.fight = self.fight - 666
            
    
    cang = Person('苍井井', '', 18, 1000)    # 创建苍井井角色
    dong = Person('东尼木木', '', 20, 1800)  # 创建东尼木木角色
    bo = Person('波多多', '', 19, 2500)      # 创建波多多角色
    
    dong.grassland()

    三 . 面向对象的三大特性

      1 . 封装

        a . 将相关功能封装到一个类中

    class Message:
        def email(self):pass
        def msg(self):pass
        def wechat(self):pass

        b . 将数据封装到一个对象中

    class Person:
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
            
    obj = Person('孙福来',18,'')

      2 . 继承

    class SuperBase:
        def f3(self):
            print('f3')
    
    class Base(SuperBase):  # 父类,基类
        def f2(self):
            print('f2')
    
    class Foo(Base):        # 子类,派生类
        def f1(self):
            print('f1')
                
    obj = Foo()
    obj.f1()
    obj.f2()
    obj.f3()    

        原则 : 先在自己类中找,没有就去父类找

        总结:

          1. 继承编写 

            class Foo(父类):
          pass

    2. 支持多继承(先找左/再找右)


    3. 为什么要有多继承?
            提供代码重用性
        C3算法:
          python2:
              经典类
              新式类:
    如果自己或自己的前辈只要有人继承object,那么就是新式类
          python3:
              新式类

            
            经典类和新式类的查找成员的顺序不一样
              经典类: 一条道走到黑(深度优先)
              新式类: C3算法实现(python2.3更新是c3算法)
    class A(object):
        pass
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    class D(object):
        pass
    
    class E(D,C):
        pass
    
    class F(object):
        pass
    
    class G(F):
        pass
    
    class H(C,G):
        pass
    
    class Foo(E,H):
        pass
    
    
    # print(E.__mro__)
    # print(H.__mro__)
    """
    L(Foo + L(E)  + L(H) )
    
    
    
    L(E) = E,D,C,B,A,object
    L(H) = H,C,B,A,G,F,object
    
    Foo = (object) + (G,F,object)
    Foo,E,D,H,C,B,A,G,F,object
    """
    print(Foo.__mro__)
    c3算法
          获取第一个表头和其他表位进行比较,不存在则拿走,如果存在,则放弃,然后获取第二个表位的表头再次和其他表位的表尾进行比较.
        总结:
          经典类: 一条道走到黑(深度优先)
          新式类: 留个根(科学C3算法)
        注意:
          super是遵循__mro__执行顺序

      3 . 多态

        多种形态或多种状态

        鸭子模型,只要可以嘎嘎叫就是鸭子

        由于python原生态支持多态,所以没有特殊性

    class Foo1:
        def f1(self):
            pass 
    
    class Foo2:
        def f1(self):
            pass 
    
    class Foo3:
        def f1(self):
            pass 
            
            
    def func(arg):
        arg.f1()
        
    obj = Foo1() # obj= Foo2()   obj = Foo3()
    func(obj)
  • 相关阅读:
    linux下错误的捕获:errno和strerror的使用
    三角识别注意事项
    关于udo3d双目相机的嵌入式板子系统重装
    为网页背景添加一个跟随鼠标变幻的动态线条
    API工具下载地址记录一下
    Eclipse 安装 SVN 插件的两种方法
    java技术面试之面试题大全
    烧绳子问题
    Java web 项目 web.xml 配置文件加载过程
    mysql绿色版安装配置
  • 原文地址:https://www.cnblogs.com/xiangweilai/p/9542557.html
Copyright © 2011-2022 走看看