封装之如何隐藏对象及封装的意义

python中通常在属性和方法前加__(两条下划线)来进行属性和方法的隐藏。

特点:

1.在类外无法直接obj.__AttrName

2.在类内部可以直接使用obj.__AttrName

3.子类无法覆盖父类__开头的属性

1.在类外无法直接obj.__AttrName

class A:
    def __init__(self, name, life):
        self.__name = name
        self.__life = life

    def __run(self):
        print(‘run‘)

    def sing(self):
        self.__run()
        print(‘sing‘)

b = A(‘gaohui‘, 100)
print(b.__name)

报错:
AttributeError: ‘A‘ object has no attribute ‘__name‘

2.在类内部可以直接使用obj.__AttrName

class A:
    def __init__(self, name, life):
        self.__name = name
        self.__life = life

    def __run(self):
        print(‘run‘)

    def sing(self):
        self.__run()
        print(‘sing‘)

b = A(‘gaohui‘, 100)
b.sing()

输出结果:
run
sing

此时的__run正常输出了,因为在类的定义时,self.__run()已经便成了self._A__run()

3.子类无法覆盖父类__开头的属性

class A:
    def __init__(self, name, life):
        self.__name = name
        self.__life = life

    def __run(self):
        print(‘run‘)

    def sing(self):
        self.__run()
        print(‘sing‘)

class B(A):
    def __init__(self, name, age, life):
        super().__init__(name, age)
        self.__life = life

    def __run(self):
        print(‘---‘)

print(A.__dict__)
print(B.__dict__)

输出结果:
{‘__module__‘: ‘__main__‘, ‘__init__‘: <function A.__init__ at 0x1068190d0>, ‘_A__run‘: <function A.__run at 0x1068192f0>,
{‘__module__‘: ‘__main__‘, ‘__init__‘: <function B.__init__ at 0x106819730>, ‘_B__run‘: <function B.__run at 0x1068197b8>,

两个run方法的属性是不一样的。

方法和属性隐藏需要注意的地方:

1.外部不能直接饮用,需要对象._类__属性的形式可以提出隐藏的属性和方法

2.变形的过程只有在类的定义时发生一次,再次赋值时不会变形。

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

1.外部不能直接饮用,需要对象._类__属性的形式可以提出隐藏的属性和方法

class A:
    def __init__(self, name, life):
        self.__name = name
        self.__life = life

    def __run(self):
        print(‘run‘)

    def sing(self):
        self.__run()
        print(‘sing‘)

a = A(‘gaohui‘, 100)
print(a._A__name)

输出结果:
gaohui

2.变形的过程只有在类的定义时发生一次,再次赋值时不会变形。

class A:
    def __init__(self, name, life):
        self.__name = name
        self.__life = life

    def __run(self):
        print(‘run‘)

    def sing(self):
        self.__run()
        print(‘sing‘)

A.__b = 1
a = A(‘gaohui‘, 100)
print(a._A__name)
print(A.__b)

输出结果:
gaohui
1

当类已经定义好了,再次定义时不会变形成隐藏的模式。

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

class A:
    def __fa(self):     *_A__fa
        print(‘from A‘)

    def test(self):
        self.__fa()  # 此时的fa方法是变形过的_A__fa,所以之行类A中的fa方法

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

b = B()
b.test()

输出结果:

from A

封装数据属性的意义:明确的区分内外,控制外部对隐藏的属性的操作行为

class A:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def tell_info(self):        # 可以通过一个接口来显示被隐藏的数据,不能直接被外部调用
        print(‘name is %s, age is %s‘ % (self.__name, self.__age))

    def search_info(self, name, age):
        if not isinstance(name, str):  # 检验是不是字符串
            print(‘姓名为字符串‘)
            return
        if not isinstance(age, int):
            print(‘年龄已经为整数‘)
            return
        self.__name = name
        self.__age = age
        self.tell_info()

st = A(‘GAO‘, 23)
print(st.__dict__)
#st.search_info(‘Gww‘, 23)  # 可以通过一个接口来修改name和age,而不是直接修改

封装方法:

class ATM:
    def __card(self):
        print(‘插卡‘)

    def __auth(self):
        print(‘用户验证‘)

    def __input(self):
        print(‘输入取款金额‘)

    def withdraw(self):
        self.__card()
        self.__auth()
        self.__input()

a = ATM()
a.withdraw()

原文地址:https://www.cnblogs.com/huizaia/p/9670021.html

时间: 2024-11-05 19:04:17

封装之如何隐藏对象及封装的意义的相关文章

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&amp;懒汉式

第一讲  面向对象概念 1.  定义 相对于与面向过程而言的,将功能封装进对象,我们只关心具备了该功能的对象,而不用关注对象的具体细节. 面向对象的特点:使复杂问题简单化.我们只关心什么对象能处理什么事情,而不用关心具体的实现细节. 2.  面向对象特征 封装.继承.多态. 第二讲  类和对象的关系 1.  概述 类就是:对现实生活中事物的描述,可以是实体的事物也可以是一件事等: 对象是:是某类事物的实例,实实在在存在的个体: 映射到java中,描述就是class定义的类. 具体对象就是对应ja

匿名对象,封装,构造代码块、静态代码块、内部类、匿名内部类

匿名对象:没有引用类型变量指向的对象就称为匿名对象. 匿名对象的主要作用:简化书写 匿名对象主要用于两种应用场景: 1.如果一个对象的方法只会调用一次的时候,然后该对象就不再使用了,这时候就可以使用匿名对象 2.作为参数传递 封装的步骤: 1.私有化要封装的属性 2.根据需求提供对应的get或set方法 封装的好处: 1.提高了数据的安全性 2.操作简单 3.隐藏了实现 封装一定会用上的场景:如果是实体类的属性,在开发过程中,全部都会封装起来 构造代码块:创建一个对象的时候,给对象进行统一的初始

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

对象的封装

封装是指依照信息屏蔽的原则,把对象的属性和操作结合在一起,构成一个独立的对象. 通过限制对属性和操作的訪问权限.能够将属性"隐藏"在对象内部.对外提供一定的接口,在对象之外仅仅能通过接口对对象进行操作. 封装性添加了对象的独立性,从而保证了数据的可靠性. 外部对象不能直接操作对象的属性,仅仅能使用对象提供的服务. 类中的数据成员的类型能够是随意的.能够定义各种类型的变量.指针.数组等,甚至是其它类的对象. 在说明数据成员时.一般按数据成员的类型大小,由小到大说明,这样可提高空间利用率.

基础学习day05---面向对象一类,对象、封装

一.面向对象   1.1.面向对象的概念 很经典的一句话----------万物皆对象 定义:面向对象一相对面向过程而言的 面向对象和面向过程都是一种思想 面向过程------强调的是功能行为  语言:C语言 面向对象------将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 1.2.什么是类 我肯定说,不知道.不清楚. 简单讲类是java中的基本单元,类是具有相同特性和行为的对象集合 1.3.类的定义 class 类名{ 数据类型  属性 ; …. public 返回值的

c# 面相对象2-之封装性

c# 面相对象2-之封装性 一.封装特性: 这是一种隐藏的特性.可以用一个公式来展示类的封装特性: 封装的类=数据  +  对此数据进行的操作(即算法) 通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西. 在面向对象理论中,封装这个概念拥有更为宽广的含义.小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中. 具备这种封装的意识,是掌握面向对象分析与设计技巧的关键 二.类的成员: 成员变量

第一章 对象和封装

[学习目标]: [学习目标]: =>①使用类图描述设计 =>②掌握面向对象设计的基本步骤 =>③掌握类和对象的概念 =>④掌握构造方法及其重载 =>⑤掌握封装的概念及其使用 1.1  用面向对象开发系统 1.1.1  为什么使用面向对象? 现实世界是面向对象的,面向对象就是采用"现实模拟"的方法设计和开发程序. 面向对象技术利用"面向对象的思想"去描述"面向对象的世界",实现了虚拟世界和现实世界的一致性,符合人们的思

Java_类与对象03_封装和private、this、super、static关键字

A    封装:类中的成员变量为private(私有),为私有的成员变量提供公有的get()或set(). 封装的好处: i.      隐藏实现细节,提供共有的访问方式 ii.     提高了代码的复用性 iii.    提高安全性 封装的原则(思想): i.      将不需要对外提供的内容隐藏起来 ii.     把属性隐藏,提供公共方法对其访问 封装的体现:private是封装的一种体现. B    private: i.      是一个权限修饰符 ii.     可以修饰成员(成员变

day19-面向对象之封装、property特性、绑定与非绑定

一.面向对象之封装 1.1.引言 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 2.1-如何隐藏(在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)) #其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语