在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','毛毛'))
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。