封装
封装(1)
# 广义上面向对象的封装:面向对象的思想本身就是一种封装,只让自己的对象能调用自己类中的方法 # 狭义上的封装---面向对象的三大特性之一 # 封装 # 隐藏对象的属性和实现细节,仅对外提供公共访问方式 # python中在类里定义私有属性时,使用双下划线作为前缀可将属性变为私有属性,不可被外部直接通过对象访问,我们也不应该通过其他手段去在外部访问私有属性 # 所以所有私有的属性,都不应该在外部去进行调用 # 好处 # 将变化隔离 # 便于使用 # 提供复用性 # 提供安全性 # 封装原则 # 将不需要对外提供的内容都隐藏起来 # 把属性都隐藏,提供公共方法对其方法 class Persion: __key = 123 # 私有的类静态属性,只能在类中使用,同样不能在外部调用 def __init__(self, name, password): self.name = name self.__passwd = password # 私有属性,双下划线开头,python中只是在代码层做了加私有,此时不允许外面访问 def get_pwd(self): return self.__passwd # 在类的内部使用私有属性时,其实本质上带上了_类名变成了_类名__属性来进行访问的私有属性 def __func(self): # 私有方法, 无法被外部使用,类内部自己使用 print('haha') def __func1(self): self.__func() alex = Persion('alex', 'alex3714') #print(alex.__passwd) # 无法调到 print(alex.__dict__) # {'_Persion__passwd': 'alex3714', 'name': 'alex'} print(alex._Persion__passwd) # alex3714 此种办法调到了,但是不准这么用,要约束自己 print(alex.get_pwd()) # alex3714
封装(2)
class Room: def __init__(self, name, length, width): self.__name = name self.__length = length self.__width = width def set_name(self, newName): if type(newName) is str and newName.isdigit() == False: self.__name = newName else: print('不合法姓名'); def area(self): return self.__length * self.__width jin = Room('金老板', 2, 1) jin.set_name('2') # 父类的私有属性(__属性)不能被子类调用 # class Foo: # __key = 123 # _Foo_key # # class Son(Foo): # print(Foo.__key) # _Son__key # 总结:会用到私有属性的场景 # 隐藏起一个属性 不想让类的外部调用, # 想保护这个属性,不想让属性随意被改变 # 想保护这个属性,不想让子类继承
真正的封装是,经过深入的思考、做出良好的抽象,给出完整且最小的接口,并使得内部细节可以对外透明(注意:对外透明的意思是,外部调用者可以顺利的得到自己想要的任何功能,但却完全意识不到内部细节的存在)