python学习笔记(二十三)私有方法和私有属性

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

但是,从前面Person类的定义来看,外部代码还是可以自由地修改一个实例的name属性。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

import redis
class My(object):
    def __init__(self):
        self.__host = '118.24.3.40'  #私有变量,只能在类里面使用,前面加两个下划线
        self.__port = 6379
        self.__password = 'HK139bc&*'
        try:
            self.r = redis.Redis(host=self.__host,port=self.__port,password=self.__password)
        except Exception as e:
            print('redis连接失败。。。。')

    def get(self,k):
        res = self.r.get(k)
        if res:
            return res.decode()
        return None
    def __close(self):          #私有方法
        print('close')
    def str_set(self,k,v=None):
        if v:
            self.r.set(k,v)
        return None
    def str_delete(self,k):
        #str类型的删除key
        if self.get(k):
            self.r.delete(k)
        else:
            print('redis中没有该key')
    def hash_get(self,Dk,Xk):
        # hash类型获取单个key
        res = self.r.hget(Dk,Xk)
        if res:
            return res.decode()
        return None
    def hash_getall(self,Dk):
        #hash类型获取key里面的所有数据
        res = self.r.hgetall(Dk)
        new = {}
        for k,v in res:
            new[k.decode()] = v.decode()
        return new

    def hash_set(self,Dk,Xk,v=None):
        #hash类型set
        if v:
            self.r.hset(Dk,Xk,v)
        return None
    def hash_del(self,Dk,Xk):
        #删除某个hash里面小key
        if self.r.hget(Dk,Xk):
            self.r.hdel(Dk,Xk)
        else:
            print('该key不存在')

    def hash_delkey(self,Dk):
        if self.r.hgetall(Dk):
            self.r.delete(Dk)
        else:
            print('该hash key不存在。。。')
    def clean_redis(self):
        #清理redis
        for k in self.r.keys():
            self.r.delete(k)

if __name__ == '__main__':
    my = My()
    my.hash_set('小Baby','毛毛')
    print(my.hash_get('小Baby33','毛毛'))

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

原文地址:https://www.cnblogs.com/mululu/p/9072799.html