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...

猜你喜欢

转载自www.cnblogs.com/fenggf/p/9129820.html