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