首页 > 其他 > 详细

28、封装

时间:2020-04-08 22:16:12      阅读:58      评论:0      收藏:0      [点我收藏+]

一、封装介绍

  封装、继承、多态是面向对象三大特性中最核心的一个
  封装就是将数据和功能整合在一起。

  针对封装的属性,将会控制对封装对象的访问,分别是隐藏和开放接口
二、将封装的属性进行隐藏操作

2.1、怎么隐藏

  在属性名前加入__前缀,将会实现对外隐藏的效果

2.2、隐藏时需要注意的问题  

  1、在类的外部无法直接访问到隐藏的属性,但是知道了类的名字和属性名之后就能拼出名字:_类名__属性,接着就能用这个名字访问,这属于一种加密手段,所以没有破解的意义。 

class Foo:
    __x = 1  # _Foo__x       #将x进行隐藏
    def __f1(self):               # _Foo__f1    
        print(from test)
print(Foo.__dict__)            #可以访问
print(Foo._Foo__x)           #已隐藏,找不到,报错   
print(Foo._Foo__f1)            #已隐藏,找不到,报错    

  2、这种隐藏是对外不对内的,因为__开头的属性在检查语法的时候回统一变形

class Foo:
    __x = 1                                    # _Foo__x = 1         隐藏
    def __f1(self):                           # _Foo__f1               隐藏
        print(from test)
    def f2(self):
        print(self.__x)                      # print(self._Foo__x),可以访问到
        print(self.__f1)                     # print(self._Foo__f1),可以访问到
print(Foo.__x)                             #无法访问
print(Foo.__f1)                             #无法访问
obj=Foo()                                   #可以访问
obj.f2()                                        #可以访问
                                                            

  3、这种变形操作只会在检查语法的时候发生一次吗,之后定义的都不会发生变形

class Foo:
    __x = 1                                             # _Foo__x = 1
    def __f1(self):                                      # _Foo__f1
        print(from test)
    def f2(self):
        print(self.__x)                                 # print(self._Foo__x)
        print(self.__f1)                                # print(self._Foo__f1)
Foo.__y=3                                              #后定义的,有地址
print(Foo.__dict__)                                    
print(Foo.__y)                                            

2.3、为什么要隐藏

  为了隔离复杂度,隐藏数据属性,可以限制类外部对数据的直接操作

  类内应该提供接口,为类外部的间接提取数据提供对接方式

# 设计者:egon
class People:
    def __init__(self, name):
        self.__name = name
    def get_name(self):
        # 通过该接口就可以间接地访问到名字属性
        # print(‘小垃圾,不让看‘)
        print(self.__name)
    def set_name(self,val):
        if type(val) is not str:
            print(小垃圾,必须传字符串类型)
            return
        self.__name=val
# 使用者:
 obj = People(egon)
 print(obj.name) # 无法直接用名字属性
 obj.set_name(EGON)
 obj.set_name(123123123)
 obj.get_name()

 

 

 

 

  

 

28、封装

原文:https://www.cnblogs.com/jingpeng/p/12662782.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!