python3 面向对象之封装

封装是是面向的特点之一,同时这也是最重要的,对象可以没有继承,可以没有多态,但是不能没有封装,没有封装的对象就不是一个合格的对象.

封装内分为属性方法,初次接触的同学可能不太习惯,但是,不要紧.

你可以把属性想象成一个人的名字,年龄等信息,通常都是名词性质的,而方法想象成是一种行为,比如一个人吃饭,睡觉等,通常是具有动词性质的.

而属性和方法又有公有和私有的划分,何为公有何为私有?看下面的代码.

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类中对私有和公有进行合理的划分,和提供较完善的封装,这是一种好的编程思想和习惯.

猜你喜欢

转载自www.cnblogs.com/liu-shi-xiong/p/9038508.html