iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python面向对象中封装的概念是什么
  • 464
分享到

Python面向对象中封装的概念是什么

2023-06-29 10:06:27 464人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python面向对象中封装的概念是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 封装的概念封装其实在我们的生活中处处都是,如电视机,电脑,手机等物品。我们通常只能看到其

这篇文章将为大家详细讲解有关python面向对象中封装的概念是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一 封装的概念

封装其实在我们的生活中处处都是,如电视机,电脑,手机等物品。我们通常只能看到其外部的形状,以及使用他们提供的功能,并不能看到其内部复杂的硬件组成,这些都是封装好的,不能让我们看到,避免我们的一些“特殊”操作,使其不能正常工作。编程源于生活。在Python中也有对对象的封装操作,使其对外只提供固定的访问模式,不能访问其内部的私有属性和私有方法。python中的封装,一般指的是对类属性,类方法的封装,即类属性私有化和类方法私有化,具体如下面的小结所讲。

二 _ 和__ 对属性和方法的私有化

1. 单下划线_

当类中的属性和方法以_ 单下划线开头时,即说明这是类的保护变量和保护方法,按照编码约定,是不希望被外部访问的。但如果你要进行访问,也不会报错。

如下:

class A():    #_ 声明是保护属性和保护方法    _name = '张三'    def __init__(self):        self._age = 23    def _method(self):        print("我叫{},今年{}岁".fORMat(self._name, self._age))if __name__ == '__main__':    a = A()    #打印类A的dir    print(a.__dir__())    #访问保护变量和保护方法    print(a._name)    a._method()

输出结果:

>>>
['_age', '__module__', '_name', '__init__', '_method', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
张三
我叫张三,今年23岁

可以看出,以_单下划线开头的属性和方法其实在类外部是可以访问的,但是根据约定,当我们看见这样的属性和方法时,不应该在外部对其进行访问。

2. 双下划线__

上面以单下划线开头的属性和方法虽然是保护的,但是在外部还是可以访问的。而当你看到以双下划线__开头的属性和方法时,请记住它们是类的私有属性和私有方法,在类外以及子类中以常规访问类属性类方法的方法是无法访问的,也无法对其进行修改,如下

class B():    #__ 声明是私有化的    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        #私有方法        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def fun(self):        #公有方法        print("this is a public method")  if __name__ == '__main__':    b = B()    #打印类B的dir    print(b.__dir__())    #访问类B的私有属性和私有方法    b.fun()    print(b.__name, b.__age, b.__luange)    b.__method()

输出结果:

>>>
['_B__age', '_B__luange', '__module__', '_B__name', '__init__', '_B__method', 'fun', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
this is a public method
Traceback (most recent call last):
  File "C:/Users/admin/python-learning/python学习文件/Python基础/python类封装.py", line 56, in <module>
    print(b.__name, b.__age, b.__luange)
AttributeError: 'B' object has no attribute '__name'

从结果可以看出,访问类B的公有方法fun()是正常输出的,但是当我们访问私有属性name时就抛错:类B没有name属性。上面单下划线时,我们打印类A的dir,可以看到类A的name属性和method方法在dir里面是下面这样的

Python面向对象中封装的概念是什么

上面我们也打印了类B的私有属性和私有方法,如下:

Python面向对象中封装的概念是什么

可以看到私有属性和私有方法都变成了_B__属性和_B__方法的形式,所以我们在上面以__ name或者name的形式去访问是报错的,其实我们如果以 类名(). _ 类名__ 属性(实例属性)或者类名. _ 类名__ 属性(类属性)的形式去访问,还是会访问成功的。如下

class B():    #__ 声明是私有化的    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        #私有方法        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def fun(self):        #公有方法        print("this is a public method")if __name__ == '__main__':    b = B()    #打印类B的dir    print(b.__dir__())    #访问类B的私有属性和私有方法    b.fun()    print(B._B__name, b._B__age, b._B__luange)    b._B__method()

结果如下:

>>>
['_B__age', '_B__luange', '__module__', '_B__name', '__init__', '_B__method', 'fun', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
this is a public method
张三 23 python
我叫张三,今年23岁,我喜欢python。

3. 子类中访问父类的私有属性和私有方法

子类无法访问父类的私有属性和私有方法:

class B():    #__ 声明是私有化的    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        #私有方法        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def fun(self):        #公有方法        print("this is a public method")class C(B):    def __init__(self):        super().__init__()    def fun1(self):        #访问父类B的私有属性和私有方法        print(self.__name, self.__age, self.__luange)        self.__method()if __name__ == '__main__':    c = C()    c.fun1()

输出结果:

>>>
AttributeError: 'C' object has no attribute '_C__name'
AttributeError: 'C' object has no attribute '_C__method'

可以看出子类也是无法访问父类的私有属性和私有方法的。

当子类中的的属性和方法与父类的私有属性,私有方法同名时,不会覆盖父类的私有属性和私有方法。

class B():    #__ 声明是私有化的    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        #私有方法        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def fun(self):        #公有方法        print("this is a public method")class C(B):    __name = '李四'    def __init__(self):        super().__init__()        self.__age = 24        self.__luange = 'c++'    def fun1(self):        #访问父类B的私有属性和私有方法        print(self.__name, self.__age, self.__luange)        self.__method()    def __method(self):        #类C的私有方法,与父类方法同名,但不重写父类方法        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))        #调用父类的私有方法        B()._B__method()if __name__ == '__main__':    c = C()    #访问类C的私有方法    c._C__method()

结果如下:

>>>
我叫李四,今年24岁,我喜欢C++。
我叫张三,今年23岁,我喜欢python。

可以看到,子类C并没有重写父类B的__method()方法。这是为什么呢?我们打印一下B和C的dir,如下:

>>>
['_B__age', '_B__luange', '_C__age', '_C__luange', 'fun1',
 '_C__method', '__doc__', '_B__name', '_B__method', '_C__name', ...]

可以看到,在类C的dir中,父类B的私有属性和私有方法是以 _B__属性(方法)存在的,二类C自己的私有属性和私有方法是以_C__属性(方法)存在的,即类的私有属性和私有方法会以_类名_属性(方法)的形式存在dir中,所以当子类的属性和方法与父类的私有属性和私有方法同名时,并不会覆盖重写。

三 访问及修改类的私有属性和私有方法

类通过对属性和方法的私有化,可以对其起到封装保护作用。但是,当外部需要访问和改变时怎么办呢?就像电视机,电脑也会对外提供固定的接口。
上面,虽然我们可以通过类名(). _ 类名__ 属性(实例属性)或者类名. _ 类名__ 属性(类属性)的形式去访问类的私有属性和私有方法,但是这是违反编程规范的,不支持这么做,就像不会拆开电视机对其操作一样。

正确对类的私有属性和私有方法进行访问修改的一般有两种发方法,如下:

1. 自定义公有方法

class D():    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def get_value(self):        return self.__name, self.__age, self.__luange    def get_method(self):        self.__method()    def set_value(self, name, age, luange):        self.__name, self.__age, self.__luange = name, age, luangeif __name__ == '__main__':    d = D()    #通过get_value方法访问私有属性    print(d.get_value())    #通过get_method方法访问私有方法    print('=' * 30)    d.get_method()    #通过set_value方法修改私有属性    print('='*30)    print(d.get_value())    d.set_value('王二麻子', 25, 'linux')    print(d.get_value())    d.get_method()

输出结果:

>>>
('张三', 23, 'python')
==============================
我叫张三,今年23岁,我喜欢python。
==============================
('张三', 23, 'python')
('王二麻子', 25, 'Linux')
我叫王二麻子,今年25岁,我喜欢Linux。

可以看到,我们通过自定义的的get_value(),get_method()以及set_value()方法就实现了对私有属性和私有方法的访问和修改。

2. property

property一般有两个作用,如下:

  • 作为装饰器,@property 将类的方法转为只读的类属性

  • property 重新实现一个属性的 getter 和 setter 方法

来看看下面这个E类,如下:

class E():    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    def get_value(self):        return self.__name    def set_value(self, name):        self.__name = name    getValue = property(get_value, set_value)    @property    def get_method(self):        self.__method()if __name__ == '__main__':    e = E()    #访问    print(e.getValue)    e.get_method    #修改    e.getValue = '王二'    print(e.getValue)

结果:

>>>
张三
我叫张三,今年23岁,我喜欢python。
王二

可以看到,我们将get_valueset_value方法传入property后,类方法就转换成类属性,并赋值给getValue变量。此时e.getValue就是只读,即get_value方法,e.value = &lsquo;王二&rsquo; 就是修改,即get_value方法。同一,通过@propert,将get_method方法,变成了属性。

下面property 重新实现一个属性的 getter 和 setter 方法,不同于上面的写法,较上面常用。

class E():    __name = '张三'    def __init__(self):        self.__age = 23        self.__luange = 'python'    def __method(self):        print("我叫{},今年{}岁,我喜欢{}。".format(self.__name, self.__age, self.__luange))    @property    def name(self):        return self.__name    @name.setter    def name(self, name):        self.__name = nameif __name__ == '__main__':    e = E()    #访问    print(e.name)    #修改    print("修改前:", e.name)    e.name = '隔壁老王'    print("修改后:", e.name)

输出结果:

>>>
张三
修改前: 张三
修改后: 隔壁老王

上面是首先把name方法送给propert装饰器进行装饰,然后调用装饰后的setter方法,即可实现对私有属性进行修改。

关于“Python面向对象中封装的概念是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Python面向对象中封装的概念是什么

本文链接: https://www.lsjlt.com/news/324162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python面向对象中封装的概念是什么
    这篇文章将为大家详细讲解有关Python面向对象中封装的概念是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 封装的概念封装其实在我们的生活中处处都是,如电视机,电脑,手机等物品。我们通常只能看到其...
    99+
    2023-06-29
  • python中面向对象的概念是什么
    面向对象的概念是一种编程范式,它将数据和操作数据的方法打包在一起,形成对象。对象是类的实例,类是用来描述相似对象的模板。面向对象的编...
    99+
    2023-10-12
    python
  • python中面向对象_类_对象的概念与
    1. 面向对象的概念,面向对象是一种编程思想。 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型     2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤。 面向对象关注的是谁能完成工作。 面...
    99+
    2023-01-30
    面向对象 对象 概念
  • Python面向对象之面向对象基本概念
    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果;函数不仅能执行,还能返回结果。 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实现; 根据开发需求,将某些功能独立的...
    99+
    2023-01-31
    面向对象 基本概念 Python
  • C++中的面向对象编程概念是什么
    本篇文章给大家分享的是有关C++中的面向对象编程概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.对象(Object),这个概念可以说是面向对象里面的最为核心的概念,...
    99+
    2023-06-17
  • OOP面向对象编程的概念是什么
    面向对象编程(Object-Oriented Programming,OOP)是一种编程范式或编程思想,它将计算机程序组织为对象的集...
    99+
    2023-10-25
    OOP
  • Python面向对象语言的概念
    这篇文章主要讲解了“Python面向对象语言的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python面向对象语言的概念”吧!在我们的程序中,我们都是根据操作数据的函数或语句块来设计程...
    99+
    2023-06-17
  • JavaScript面向对象中继承的概念
    本篇内容介绍了“JavaScript面向对象中继承的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、...
    99+
    2024-04-02
  • Python面向对象中的封装详情
    目录一 封装的概念二 _ 和__ 对属性和方法的私有化1. 单下划线_2. 双下划线__3. 子类中访问父类的私有属性和私有方法三 访问及修改类的私有属性和私有方法1. 自定义公有方...
    99+
    2024-04-02
  • php中封装的概念是什么
    本篇内容主要讲解“php中封装的概念是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中封装的概念是什么”吧!在php中,封装就是将一个类的使用和实现分开,只保留有限的接口(方法)与外部...
    99+
    2023-06-29
  • Python面向对象编程之类的概念
    目录1、面向对象基本概念1.1 万物皆对象1.2 面向对象编程1.3 面向对象的特征2、Python面向对象的术语3、Python类的构建3.1 类的基本构建 3.2 类的构造函数3...
    99+
    2024-04-02
  • Java封装的概念是什么
    这篇文章主要介绍“Java封装的概念是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java封装的概念是什么”文章能帮助大家解决问题。封装封装的概念将类的某些信息隐藏在类的内部,不允许外部程序直...
    99+
    2023-06-30
  • Python中关于面向对象概念的详细讲解
    面向对象编程的2个非常重要的概念: 类和对象 对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类。 类用来描述具有...
    99+
    2024-04-02
  • C语言面向对象编程中的封装是什么
    这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!...
    99+
    2023-06-29
  • 怎么理解Java面向对象概念
    这篇文章主要讲解了“怎么理解Java面向对象概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java面向对象概念”吧!Java作为构建编程语言的核心基础,已经得到了越来越多人的青睐...
    99+
    2023-06-02
  • JAVA面向对象程序设计的基本概念是什么
    这篇文章主要讲解了“JAVA面向对象程序设计的基本概念是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JAVA面向对象程序设计的基本概念是什么”吧!§ 6.1 面 向 对 象 的 程 序...
    99+
    2023-06-03
  • python 面向对象之class和封装
    # 封装 # Python并没有真正的私有化支持,但可用下划线得到伪私有 访问私有变量:实例._类名__变量名 访问私有方法:实例._类名__方法名() class Wife02(...
    99+
    2024-04-02
  • DOM对象的概念是什么
    今天小编给大家分享一下DOM对象的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2024-04-02
  • php对象的概念是什么
    PHP对象是PHP中的一种数据类型,它可以被看作是具有属性和方法的实体。对象是基于类的实例化,类是一个定义对象属性和方法的模板。对象...
    99+
    2023-10-18
    php
  • Python中,什么是面向对象?
    面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象则是根据模板创建的实...
    99+
    2023-01-31
    面向对象 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作