封装

 

  封装(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


# 总结:会用到私有属性的场景
    # 隐藏起一个属性 不想让类的外部调用,
    # 想保护这个属性,不想让属性随意被改变
    # 想保护这个属性,不想让子类继承

 

真正的封装是,经过深入的思考、做出良好的抽象,给出完整且最小的接口,并使得内部细节可以对外透明(注意:对外透明的意思是,外部调用者可以顺利的得到自己想要的任何功能,但却完全意识不到内部细节的存在)
posted @ 2018-10-02 17:53  _小溢  阅读(182)  评论(0)    收藏  举报