• Python3学习笔记-继承、封装、多态


    1、继承

      在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。

      类的属性和方法都可以被子类继承

      比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印一句话,然后新建一个叫Dog的类,继承了Animal类。 所以Dog可以用Animal类里的函数run(), eat(),同时自己也可以定义自己的函数。

    class Aminmal(object):  # 定义一个Aminmal类
        def __init__(self):
            self.name='Kate'
    
        def run(self):
            print('Animal is running...')
    
    class Dog(Aminmal):  #继承Aminmal类
        def run(self):  #子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()
            print('Dog is running...')
    
        def eat(self):
            print('Eating meat...')
    
    class Cat(Aminmal):#继承Aminmal类,获得了父类的全部功能
        pass
    
    dog = Dog()
    dog.run()
    print(dog.name)
    
    cat = Cat()
    cat.run()
    print(cat.name)
    
    # 结果如下:
    # Dog is running...
    # Kate
    # Animal is running...
    # Kate

    再看下面的代码,也是继承的典型实例:

    class Dady(object):
        def __init__(self):
            self.money = 1000000000
            self.house = '3环里20套'
        def sing(self):
            print('唱歌')
        def dance(self):
            print('跳广场舞')
        def lm(self):
            print('找朋友')
    
    class Son(Dady):    #继承只需在子类括号中写上父类类名就可以继承了
        def dance(self):   #重写dance(self)这个方法
            print('跳霹雳舞')
    
    if __name__ == '__main__':   #调试代码使用
        aa = Son()     #实例化一个son,这样他会继承Dady类里的属性和方法
        print(aa.house)    #继承父类属性
        print(aa.money)   #继承父类属性
        aa.lm()        #继承父类的lm()方法
        aa.dance()   #重写了的dance是调用son类自己的

    通过定义父类属性或者方法,子类继承,可以代码重用,例如将数据库连接的属性定义在一个Base的父类中

    class Base(object):
        def __init__(self,host,port,password):
            self.host = host
            self.port = port
            self.password = password
    
    class Mysql(Base):
        pass
    
    class Redis(Base):
        pass

    2、封装

      把一些功能的实现细节不对外暴露,类中对数据的赋值、内部调用对外部用户是透明的,使类变成一个胶囊或容器。里面包含着类的数据和方法。  

      比如说手机,把各种电子配件,封装在手机壳里面,我们只看到手机机身。对于用户来说不需要搞清楚里面所有配件分别是什么,什么作用。只需要通过手机上的按键进行操作

    import redis
    class My_redis(object):
        def __init__(self):
            self.__host= '127.0.0.1'  # 加了__就是私有变量,只能在这个My_redis类里面使用
            self.password =''
            self.port = 6379   # 端口号
            self.db= 1  # 第几个数据库
            self.r=redis.Redis(host=self.__host,port=self.port,password=self.password)
    
    
        def __close(self):  # 私有方法,只能在内里面调用
            print('close')
    
        def dy(self):
            host=self.__host
            a=self.__close
    
        def str_get(self, key):
            # str类型的获取key的值
            res = self.r.get(key)
            if res:
                return res.decode()
            return None
    
        def str_set(self, key, value,time=None):
            # str类型的新增
            if time:
                return self.r.setex(key,value,time)
            else:
                return self.r.set(key,value)  # true
    
        def str_delete(self,key):
            # str类型的删除key
            if key:
                return self.r.delete(key)  #1  0
    
    my = My_redis()
    my.str_get('feng')

    3、多态

      对不同类的对象发出相同的消息将会有不同的行为。例如,组长说大家喝点东西吧,小A喝茶,小B喝果汁,小C喝水。   

      多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。一种接口,多种实现。

    还是用上面例子,要理解多态的好处,再编写一个run_twice 函数,这个函数接受一个Animal类型的变量:

    class Aminmal(object):  # 定义一个Aminmal类
        def __init__(self):
            self.name='Kate'
    
        def run(self):
            print('Animal is running...')
    
    class Dog(Aminmal):  #继承Aminmal类
        def run(self):  #子类和父类都存在相同的run()方法时,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()
            print('Dog is running...')
    
        def eat(self):
            print('Eating meat...')
    
    class Cat(Aminmal):#继承Aminmal类,获得了父类的全部功能
        pass
    
    
    def run_twice(animal):
        animal.run()
        animal.run()
    
    run_twice(Aminmal())
    run_twice(Dog())
    run_twice(Cat())
    # Animal is running...
    # Animal is running...
    # Dog is running...
    # Dog is running...
    # Animal is running...
    # Animal is running...
  • 相关阅读:
    go入门4---数据
    hibernate之关联关系一对多
    hibernate的主键生成策略
    hibernate的入门
    struts--CRUD优化(图片上传)
    struts2--CRUD
    struts2--入
    Maven环境搭建
    EasyUI--增删改查
    easyui--权限管理
  • 原文地址:https://www.cnblogs.com/fenggf/p/9129820.html
Copyright © 2020-2023  润新知