python类的私有属性和公共属性说明

 更新时间:2022年05月09日 16:54:15   作者:yangjiajia123456  
这篇文章主要介绍了python类的私有属性和公共属性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python类私有属性和公共属性

对于python而言,类的属性的可见度只有两种,public和private。

类的私有属性便是在前面加上“__”标识符,而公共属性则不必。

在类的外面访问私有属性会引发异常。

class Base:
    def __init__(self, value):
        self.__value = value
 
b = Base(5)
print(assert b.__value)
 
Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 19, in <module>
    print(b.__value)
AttributeError: 'Base' object has no attribute '__value'

属性被私有化,即使继承他的字类也不能访问到。

class Parent:
    def __init__(self, value):
        self.__value = value 
 
class Child(Parent):
    def get_value(self):
        return self.__value
 
child = Child(4)
print(child.get_value())
 
Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 24, in <module>
    print(child.get_value())
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 21, in get_value
    return self.__value
AttributeError: 'Child' object has no attribute '_Child__value'

为何会这样?因为python会对类的私有属性做些转换,以保证private字段的私密性。当编译器看到Child.get_value方法要访问私有属性时,他会先把__value变换为_Child_value然后再进行访问,但实际上该私有属性是_Parent__value。字类无法访问父类的私有属性,只是因为访问的名称不同。

查询该对象的属性字典便知

class Parent:
    def __init__(self, value):
        self.__value = value 
 
class Child(Parent):
    def name(self):
        names = 'yang'
 
    def get_value(self):
        return self.__value
 
child = Child(4)
print(child.__dict__)
 
{'_Parent__value': 4}

python开发的原则还是要少用私有属性,如果需要保证属性不重复,可以在其前面加上单个下划线。

class Parent:
    def __init__(self, value):
        self._value = value 
 
class Child(Parent):
    def get_value(self):
        return self._value
 
child = Child(4)
assert child._value == 4

python私有属性的定义

在Java中用private对变量或者方法进行限定,则方法仅在整个类内部可见,外部不可见、不可访问。

在python中也有私有属性定义,使用函数名前缀的两个下划线进行定义。

例如 __parameter

接下来看上一个Dog的例子

class Dog(object):
    __slots__ = ('__name', 'kind', 'level')
    def __init__(self,name,kind,level):#构造函数,定义属性和初始方法
        self.__name=name
        self.kind=kind
        self.level=level#赋值
        print(f"This is a {self.kind} dog called {self.__name} with level {self.level}")
 
    def run(self):#定义类中的方法
        print(f"{self.__name} is now running!")
 
    def roll_over(self):
        print(f"{self.__name} is now rolling over!")
 
    def change_level(self):
        self.level+=1#修改类中属性的值
        print(f"The level of {self.__name} is now {self.level}")

在另一个文件里面进行调用

from Zoo.Dog import Dog#导包
 
dog=Dog("Halo","Husty",3)#实例化
 
dog.run()
dog.roll_over()
dog.change_level()#调用方法

发现当我们输入以下内容时,会报错,非法访问。

print(dog.__name)

在本例中,__name是对name进行私有限定。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python发送邮件示例(支持中文邮件标题)

    python发送邮件示例(支持中文邮件标题)

    python发送中文邮件示例,支持中文邮件标题和中文邮件内容。支持多附件。根据用户名推测邮件服务器提供商
    2014-02-02
  • Python利用pdfplumber库提取pdf中的文字

    Python利用pdfplumber库提取pdf中的文字

    pdfplumber是一个用于从PDF文档中提取文本和表格数据的Python库,它可以帮助用户轻松地从PDF文件中提取有用的信息,例如表格、文本、元数据等,本文将给大家介绍如何通过Python的pdfplumber库提取pdf中的文字,需要的朋友可以参考下
    2023-05-05
  • python random从集合中随机选择元素的方法

    python random从集合中随机选择元素的方法

    今天小编就为大家分享一篇python random从集合中随机选择元素的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 使用pytorch完成kaggle猫狗图像识别方式

    使用pytorch完成kaggle猫狗图像识别方式

    今天小编就为大家分享一篇使用pytorch完成kaggle猫狗图像识别方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python3发送request请求及查看返回结果实例

    python3发送request请求及查看返回结果实例

    这篇文章主要介绍了python3发送request请求及查看返回结果实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python使用tkinter库实现五子棋游戏

    python使用tkinter库实现五子棋游戏

    这篇文章主要为大家详细介绍了python使用tkinter库实现五子棋游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python深度学习实战PyQt5布局管理项目示例详解

    Python深度学习实战PyQt5布局管理项目示例详解

    本文具体介绍基本的水平布局、垂直布局、栅格布局、表格布局和进阶的嵌套布局和容器布局,最后通过案例带小白创建一个有型的图形布局窗口
    2021-10-10
  • python3读取文件指定行的三种方法

    python3读取文件指定行的三种方法

    考虑到深度学习领域中的数据规模一般都比较大,尤其是训练集,这个限制条件对应到实际编程中就意味着,我们很有可能无法将整个数据文件的内容全部都加载到内存中。那么就需要一些特殊的处理方式,本文将要介绍的是从文件中只读取特定行的内容的3种解决方案。
    2021-05-05
  • pyqt QGraphicsView 以鼠标为中心进行缩放功能实现

    pyqt QGraphicsView 以鼠标为中心进行缩放功能实现

    在PyQt开发中,实现QGraphicsView的鼠标中心缩放功能需要注意初始化以及关键函数的重定义,遇到不达预期的效果时,可能需要重写所有鼠标事件,本文记录了解决QGraphicsView鼠标缩放问题的过程,供开发者参考
    2024-10-10
  • 使用Atom支持基于Jupyter的Python开教程详解

    使用Atom支持基于Jupyter的Python开教程详解

    这篇文章主要介绍了使用Atom支持基于Jupyter的Python开发,Vscode虽然说也有连接Jupyter的工具,但是交互式的开发Hydrogen体验更好,需要的朋友可以参考下
    2021-08-08

最新评论