zoukankan      html  css  js  c++  java
  • python学习笔记(二十四)继承与封装

    继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承。

    实现继承的类称为子类,也叫派生类,而被继承的类称为父类,也叫超类或基类。

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

    注意:私有属性和方法不能被继承,构造方法也不能被继承

    继承的好处:

    1)提高代码的重用性和扩展性

    2)模拟现实世界的关系

    3)结构更清晰

    继承的弊端:

    1)让类的耦合性增强(某个类的改变就会影响其他和该类相关的类)

    2)打破了封装性

    写代码的原则:低耦合、高内聚。

    耦合:类和类的关系

    内聚:自己完成某件事的能力

    下面看看继承的实例吧,代码如下:

    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(Zll):    #继承只需在子类括号中写上父类类名就可以继承了
        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类自己的 

    如果我们在项目中需要使用到mysql和redis,那么这两个的连接信息我们可以写在基类中,然后redis类和mysql类分别继承基类,这样就提高了代码的重用性。

    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

    封装数据的主要原因是:保护隐私(把不想别人知道的东西封装起来)   

    封装方法的主要原因是:隔离复杂度(比如:电视机,我们看见的就是一个黑匣子,其实里面有很多电器元件,对于 用户来说,我们不需要清楚里面都有些元件,电视机把那些电器元件封装在黑匣子里,提供给用户的只是几个按钮接口, 通过按钮就能实现对电视机的操作。)

    例如,我们可以将redis操作的一些方法封装起来,以后需要用到的时候直接调用就可以了。比如:string类型的和hash类型的各种操作。代码如下:

    import redis
    
    # r = redis.Redis()
    class MyRedis():
        def __init__(self,ip,password,port=6379,db=0):
            #构造函数
            try:
                self.r = redis.Redis(host=ip,password=password,port=port,db=db)   #这时候并不会去连redis,所以捕捉不到数据库连接的异常,也可以不写try
                # r = redis.ConnectionPool(host=ip,password=password,port=port,db=db)
            except Exception as e:
                print('redis连接失败,错误信息%s'%e)
        def str_get(self,k):
            res = self.r.get(k)
            if res:
                return res.decode()
        def str_set(self,k,v,time=None):
            self.r.set(k,v,time)
        def delete(self,k):
            tag = self.r.exists(k) #判断这个key是否存在
            if tag:
                self.r.delete(k)
                print('删除成功')
            else:
                print('这个key不存在')
        def hash_get(self,name,k):
            res = self.r.hget(name,k)
            if res:
                return res.decode()
        def hash_set(self,name,k,v):
            self.r.hset(name,k,v)
        def hash_getall(self,name):
            data = {}
            # {b'12': b'1212', b'3': b'sdad', b'4': b'asdadsa'}
            res = self.r.hgetall(name)
            if res:
                for k,v in res.items():
                    k =  k.decode()
                    v = v.decode()
                    data[k]=v
            return data
        def hash_del(self,name,k):
            res = self.r.hdel(name,k)
            if res:
                print('删除成功')
                return 1
            else:
                print('删除失败,该key不存在')
                return 0
    
        @property      #(属性方法)装饰器,类似于属性的方法,调用时不用加括号
        def clean_redis(self):
            self.r.flushdb()  #清1空redis
            print('清空redis成功!')
            return 0
    
    my = MyRedis('127.0.0.1','123456')
    my.str_get('sss')
  • 相关阅读:
    Silverlight 操作Excel 中的进程资源释放问题
    Silverlight DataGridTemplateColumn 中绑定事件
    Silverlight 设置DataGrid中行的提示信息
    判断Excel单元格中是否有错
    读取配置文件生成简单的网站导航菜单
    HTTP 错误 500.21 Internal Server Error
    忽然有用到DataSet,标记学习一下
    Silverlight读取包含中文的txt(解决乱码问题)
    for/foreach/linq执行效率测试
    将object强制转换成int效率测试
  • 原文地址:https://www.cnblogs.com/mululu/p/9072976.html
Copyright © 2011-2022 走看看