封装是是面向的特点之一,同时这也是最重要的,对象可以没有继承,可以没有多态,但是不能没有封装,没有封装的对象就不是一个合格的对象.
封装内分为属性和方法,初次接触的同学可能不太习惯,但是,不要紧.
你可以把属性想象成一个人的名字,年龄等信息,通常都是名词性质的,而方法想象成是一种行为,比如一个人吃饭,睡觉等,通常是具有动词性质的.
而属性和方法又有公有和私有的划分,何为公有何为私有?看下面的代码.
1 #test2.py 2 3 class stu(): 4 def __init__(self, name, age, score): 5 self.__name = name 6 self.age = age 7 self.__score = score
1 #test.py 2 from test2 import * 3 4 xiaoming = stu("xiaoming", 15, 90) 5 6 print(xiaoming.age) 7 print(xiaoming.name)
输出结果:
15 Traceback (most recent call last): File "G:/Pycharm workspace/myproject/test.py", line 6, in <module> print(xiaoming.name) AttributeError: ‘stu‘ object has no attribute ‘name‘
大概讲解下,我在test2文件中声明了一个对象,这个对象能够保存一个人的信息,在test文件中,我进行了实例化,并且想通过实例对象的属性获取相应的值.
很明显,在我打印实例对象年龄时没有任何问题,而打印实例对象的名字时报错,究其根本,我们可以找到,是在class stu类初始化方法中,对名称和年龄的复制表示方式有所不同.
值得一提的是,在python中属性和方法,在其变量标识符前加上"__"就表示私有,反之,就是公有.
私有和公有的具体意思就是,在别人调用你的对象时,你可以隐藏部分属性或方法,这样别人是无法使用的,要知道在多人项目开发中,每个开发人员是不可能细致的查看调用别人对象具体的属性和方法,一时浪费时间,二是不一定能看懂,开发人员更多的是通过调用别人对象的方法来进行操作,就比如:
list_num = list(34, 94, 27, 49, 36) list_num.reverse()
在这两行代码只是进行简单的示范,第一句我们是实例化了一个列表对象,第二句话我们是调用了其方法.我们都知道reverse()这个函数是对列表内的元素进行反转,可是你并不知道的是它具体使用了什么算法进行反转,你所知道的只是reverse()这个函数能够对列表元素反转,这就是体现了其封装的特性.
学过java的同学一定知道,java中有get和set方法,在此我列举一下.
#test2.py class stu(): def __init__(self, name, age, score): self.__name = name self.__age = age self.__score = score def getName(self): return self.__name def getAge(self): return self.__age def getScore(self): return self.__score def setName(self, name): self.__name = name def setName(self, age): self.__age = age def setName(self, score): self.__score = score
初次接触的同学可能认为这很麻烦,但其实并不是,这体现的就是对私有属性的封装,别人想获取实例化对象的属性时是无法直接通过私有变量来访问的,只能通过get方法获取对应的值,同样只能通过set方法去更改值.
举个例子,在去银行取钱的时候,你通常的做法是,把钱放到ATM机里,再由ATM机将钱存放到钱库里,一般来讲是这个情况,不用深究.但是,你不可以直接越过钱库的安全门,然后把钱放到钱库里,换成取钱也是这个情况,取钱的时候是ATM机先从钱库中取到钱,然后再把钱交给你,你是不可以直接从钱库中拿钱,那样做是不合法的.
而面向对象中私有属性也是类似的情况,你是不能直接对属性进行操作,必须通过第三者转接这个属性的值.
在面向对象中,class类中对私有和公有进行合理的划分,和提供较完善的封装,这是一种好的编程思想和习惯.
原文地址:https://www.cnblogs.com/liu-shi-xiong/p/9038508.html