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

原文地址:https://www.cnblogs.com/liu-shi-xiong/p/9038508.html

时间: 2024-10-14 13:36:39

python3 面向对象之封装的相关文章

Python3快速入门(六)——Python3面向对象

Python3快速入门(六)--Python3面向对象 一.面向对象技术简介 1.面向对象简介 面向对象编程(Object Oriented Programing,OOP)是一种编程思想,OOP把对象当成程序的一个基本单元,一个对象包含数据和操作数据的方法.面向对象编程的三大特性如下:A.封装,可以隐藏实现细节,使代码模块化.B.继承,可以通过扩展已存在的类来实现代码重用,避免重复编写相同的代码.C.多态,封装和继承的目的都是为了实现代码重用, 而多态是为了实现接口重用,使得类在继承和派生的时候

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...

面向对象的封装性和多态性

面向对象之封装性: 1.继承要符合is-a的关系.即"子类is a 父类"——子类是父类.如:卡车是汽车,卡车is a 汽车. 2.父类中如果用Protected修饰符,表示只允许其子类访问,而不允许其他非子类访问: 父类中如果用private修饰符,子类是不能访问的. 3.除了构造方法不能被子类继承外,其他都可以直接被继承.可以用base关键字调用父类的构造函数:语法如下 :base(参数变量名) 使用base还可以调用父类的属性和方法. 注意:子类构造函数中已经定义了这些参数,在b

C#面向对象(封装)

以上就是面向对象的封装和初始化:

面向对象(封装private)

/** * Created by 刘朋程 on 2014-5-22. */ class Testprivate {     private int age = 18;              //私有化age并赋值为18 public void setAge(int age)   //设置age范围     {         if (age>0 && age<100)         {             this.age = age;             spe

Python面向对象编程-封装

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro

黑马程序员——Java基础---面向对象之封装

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 面向对象之封装      一:封装概述 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: (1)将变化隔离(内部怎样变化外部是不需要知道的,只调用即可) (2)便于使用(我们不用知道内部构造直接使用就可以) (3)提高重用性

java基础面向对象之封装

java基础面向对象之封装 2017-01-15 封装 1)封装性就是保证类内部被外部类不可见 2)所有属性都必须使用private关键字声明 3)封转后的属性如果要被外部所访问就必须实现set和get方法 例如: 使用了private声明的属性只有在自己的类是可见的 1 class Book{ 2 private String title ; //使用private声明的属性 3 private int price ; 4 } 5 public class PrivateDemo1 { 6 p

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须