面向对象三大特性之封装

1、定义

【封装】

隐藏对象的属性和实现细节,仅对外提供公共访问方式。

广义上的封装 : 属于一个类的静态和动态属性 总是出现在一个类中
             使用时永远用类名或者对象名调用
狭义上的封装 : 就是把变量\方法私有化,在类的外部以及子类中不能直接使用了

【好处】

1. 将变化隔离;

2. 便于使用;

3. 提高复用性;

4. 提高安全性;

【封装原则】

1. 将不需要对外提供的内容都隐藏起来;

2. 把属性都隐藏,提供公共方法对其访问。

2、私有变量和私有方法

1)、私有变量

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

#其实这仅仅这是一种变形操作
#类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:

class A:
    __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def __foo(self): #变形为_A__foo
        print(‘from A‘)
    def bar(self):
        self.__foo() #只有在类内部才可以通过__foo的形式访问到.

#A._A__N是可以访问到的,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形

这种自动变形的特点:

1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果

2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。

3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

这种变形需要注意的问题是:

1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N

2.变形的过程只在类的内部生效,在定义后的赋值操作,不会变形

2)、私有方法

3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

#正常情况
class A:
    def fa(self):
        print(‘from A‘)
    def test(self):
        self.fa()

class B(A):
    def fa(self):
        print(‘from B‘)

b=B()
b.test()    #from B

#把fa定义成私有的,即__fa
class A:
    def __fa(self):     #在定义时就变形为_A__fa
        print(‘from A‘)
    def test(self):
        self.__fa()     #只会与自己所在的类为准,即调用_A__fa

class B(A):
    def __fa(self):
        print(‘from B‘)

b=B()
b.test()    #from A

3、封装与扩展性

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。

#类的设计者
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
        return self.__width * self.__length

#使用者
r1=Room(‘卧室‘,‘egon‘,20,20,20)
print(r1.tell_area()) #使用者调用接口tell_area
# #结果: 400

#类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,
    #而且外部调用感知不到,仍然使用该方法,但是功能已经变了
    def tell_area(self):
        return self.__width * self.__length * self.__high

#对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
r1=Room(‘卧室‘,‘egon‘,20,20,20)   #使用者
print(r1.tell_area())
#结果: 8000

原文地址:https://www.cnblogs.com/lioushell/p/8535369.html

时间: 2024-10-07 23:06:14

面向对象三大特性之封装的相关文章

JAVA基础——面向对象三大特性:封装、继承、多态

JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据.     隐藏类的实例细节,方便修改和实现. 3.封装的实现步骤 需要注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作.当然最好使用get/set方法,比较标准. A.访问修饰符 从表格可以看出从上到下封装性越来越差. B.this关键字 1.this关键字代表当前

4月26 关于类,对象以及面向对象三大特性之封装

---恢复内容开始--- <?php//面向过程比如求一个圆的面积 $r=5; $m=3.14*$r*$r; //当直接规定半径时这是很方便的但是当变量改变时会出现代码的重复?>类和对象对象:能够见到的任何东西都可以称为对象, 也可以理解为类实例化出来的东西类: 对所有同类的对象抽象出来的东西 举例理解类和对象: 类:比如班级里面每个人相同的有学号,上课时间,休息时间,所上课程等:再比如说人所共有的姓名,性别,年龄等等,这些所公有的都可以统称为类:就像数据库没给表的第一行 对象:具体到一条具体

C# 面向对象三大特性:封装、继承、多态

面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了代码的重用机会,增加了程序开发的速度,将具备独立性特制的程序代码包装起来,修改部分程序代码时不至于会影响到程序的其他部分. 1.封装 每个对象都包含它进行操作所需要的所有信息,封装只公开代码单元的对外接口,而隐藏其具体实现,尽量不对外公开代码.使用封装有很多好处,从设计角度来讲,封装可以对外屏蔽一些

java 面向对象三大特性(封装,继承,多态)以及抽象、接口的介绍

封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员. 3.封装的基本要求是:把所有的属性私有化,对每个属性提供getter和setter方法,如果有一个带参的构造函数的话,那一定要写一个不带参的构造函数.在开发的时候经常要对已经编写的类进行测试,所以在有的时候还有重写toString方法,但这不是必须的. 继承: 1.目的:实

面向对象三大特性之封装与多态

一 .封装 最主要的作用:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装原则 将不需要对外提供的内容都隐藏起来 把属性都隐藏,提供公共方法对其访问 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self):

java面向对象三大特性之封装

 其实以前一直在做Java开发的过程中或者刚开始初学的时候没有想那么多,都是单纯的一直去做,但是自从做了某个项目之后也慢慢发现很多时候,人的精力和脑力是有限的,总是会忘记以前做过或者学过的东西,慢慢就开始了写博客的习惯,一是可以自己加强一下,二是可以分享给别人可以和大家一起讨论一下,因为每个人的见解都会让你从中获得不同的东西,就想以前遇见的一个老师一样,他说他每讲一次讲面向对象都有着不同的感觉,所以也是对自己和还奋斗在一线程序员的一种鼓励吧,希望多少年后的我们回想起来,我们曾经也是那么的拼过.

Python面向对象三大特性之封装

面向函数的编程和面向对象编程对比 vim day7-2.py #!/usr/bin/python # -*- coding:utf-8 -*- def Bar(): print 'Bar' def Hello(name): print 'I am %s' %name class Foo: def Bar(self): print 'Bar' def Hello(self,name): print 'I am %s' %name Bar() Hello('liuyueming') obj = Fo

12:面向对象三大特性(封装、继承、多态)之继承

本小节知识点: 继承基本概念 OC中的继承关系 OC中如何实现继承 1.继承基本概念 现实生活中的继承 交通工具类是一个基类(也称做父类),通常情况下所有交通工具所共同具备的特性,如速度与额定 载人的数量 按照生活常规,我们来继续给交通工具来细分类的时候,我们会分别想到有汽车类和飞机类等 等,汽车类和飞机类同样具备速度和额定载人数量这样的特性,而这些特性是所有交通工具所共有的,那么就可以让汽车或飞机类继承交通工具类,这样当建立汽车类和飞机类的时候我们无需再定义交通工具类(基类)中已经有的成员和方

面向对象三大特性之一-------封装的意义

思考 封装的意义: 封装从形式上来说,它将数据和操作界定在了某个圈子内,如果外界想要访问数据,或者使用某个操作,必须通过特殊的手段向这个圈子申请. 这个圈子便是类,特殊的手段就是接口. 即假如外界想要访问类中的数据或者使用类中某个方法的具体操作,必须通过这个类事先提供的接口来访问,这个接口一般就是方法名. 一开始学封装时产生的疑惑是 为什么要将数据和操作封装起来,然后想要使用的时候再通过接口访问,这不是很麻烦吗? 是的,确实很麻烦.但麻烦归麻烦,它带来的好处是这小小的麻烦无法所抵抗的. 首先把封