热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中的访问修饰符:公共、私有和受保护

Python中的访问修饰符:公共、私有和受保护原文:https

Python 中的访问修饰符:公共、私有和受保护

原文:https://www . geesforgeks . org/access-modifiers-in-python-public-private-and-protected/

先决条件:Python 中的下划线(_)、Python 中的私有变量

各种面向对象的语言,如 C++、Java、Python 控制访问修改,用于限制对类的变量和方法的访问。大多数编程语言都有三种形式的访问修饰符,分别是类中的 PublicProtectedPrivate
Python 使用“_”符号来确定特定数据成员或类的成员函数的访问控制。Python 中的访问说明符在保护数据免受未经授权的访问和防止数据被利用方面发挥着重要作用。
Python 中的类有三种类型的访问修饰符:


  • 公共访问修改器

  • 受保护访问修饰符

  • 私有访问修饰符


公共访问修饰符:

声明为公共的类成员很容易从程序的任何部分访问。默认情况下,类的所有数据成员和成员函数都是公共的。

Python 3


# program to illustrate public access modifier in a class
class Geek:
     # constructor
     def __init__(self, name, age):
           # public data members
           self.geekName = name
           self.geekAge = age
     # public member function     
     def displayAge(self):
           # accessing public data member
           print("Age: ", self.geekAge)
# creating object of the class
obj = Geek("R2J", 20)
# accessing public data member
print("Name: ", obj.geekName)
# calling public member function of the class
obj.displayAge()

Output: 

Name: R2J
Age: 20

在上面的程序中,geekName 和 geekAge 是公共数据成员,displayAge()方法是 Geek 类的公共成员函数。极客类的这些数据成员可以从程序的任何地方访问。

受保护的访问修饰符:

声明为受保护的类的成员只能由从该类派生的类访问。通过在类的数据成员前添加一个下划线“_”符号,可以声明该类的数据成员受到保护。

Python 3


# program to illustrate protected access modifier in a class
# super class
class Student:
     # protected data members
     _name = None
     _roll = None
     _branch = None
     # constructor
     def __init__(self, name, roll, branch): 
          self._name = name
          self._roll = roll
          self._branch = branch
     # protected member function  
     def _displayRollAndBranch(self):
          # accessing protected data members
          print("Roll: ", self._roll)
          print("Branch: ", self._branch)
# derived class
class Geek(Student):
       # constructor
       def __init__(self, name, roll, branch):
                Student.__init__(self, name, roll, branch)
       # public member function
       def displayDetails(self):
                 # accessing protected data members of super class
                print("Name: ", self._name)
                 # accessing protected member functions of super class
                self._displayRollAndBranch()
# creating objects of the derived class       
obj = Geek("R2J", 1706256, "Information Technology")
# calling public member functions of the class
obj.displayDetails()

Output: 

Name: R2J
Roll: 1706256
Branch: Information Technology

在上面的程序中,_name、_roll 和 _branch 是受保护的数据成员,_displayRollAndBranch()方法是超级类 Student 的受保护方法。displayDetails()方法是从 Student 类派生的类 Geek 的公共成员函数,Geek 类中的 displayDetails()方法访问 Student 类的受保护数据成员。

私有访问修饰符:

声明为私有的类成员只能在类中访问,私有访问修饰符是最安全的访问修饰符。类的数据成员通过在该类的数据成员前添加双下划线“__”符号来声明为私有。

Python 3


# program to illustrate private access modifier in a class
class Geek:
     # private members
     __name = None
     __roll = None
     __branch = None
     # constructor
     def __init__(self, name, roll, branch): 
          self.__name = name
          self.__roll = roll
          self.__branch = branch
     # private member function 
     def __displayDetails(self):
           # accessing private data members
           print("Name: ", self.__name)
           print("Roll: ", self.__roll)
           print("Branch: ", self.__branch)
     # public member function
     def accessPrivateFunction(self):
           # accesing private member function
           self.__displayDetails() 
# creating object   
obj = Geek("R2J", 1706256, "Information Technology")
# calling public member function of the class
obj.accessPrivateFunction()

Output: 

Name: R2J
Roll: 1706256
Branch: Information Technology

在上面的程序中,__name,__roll 和 __branch 是私有成员,__displayDetails()方法是私有成员函数(这些只能在类内访问),accessPrivateFunction()方法是类 Geek 的公共成员函数,可以从程序内的任何地方访问。accessPrivateFunction()方法访问 Geek 类的私有成员。

下面是一个程序,说明 Python 中一个类的所有上述三个访问修饰符(公共、受保护的和私有)的使用:

Python 3


# program to illustrate access modifiers of a class
# super class
class Super:
     # public data member
     var1 = None
     # protected data member
     _var2 = None
     # private data member
     __var3 = None
     # constructor
     def __init__(self, var1, var2, var3): 
          self.var1 = var1
          self._var2 = var2
          self.__var3 = var3
    # public member function  
     def displayPublicMembers(self):
          # accessing public data members
          print("Public Data Member: ", self.var1)
     # protected member function  
     def _displayProtectedMembers(self):
          # accessing protected data members
          print("Protected Data Member: ", self._var2)
     # private member function  
     def __displayPrivateMembers(self):
          # accessing private data members
          print("Private Data Member: ", self.__var3)
     # public member function
     def accessPrivateMembers(self):    
          # accessing private member function
          self.__displayPrivateMembers()
# derived class
class Sub(Super):
      # constructor
       def __init__(self, var1, var2, var3):
                Super.__init__(self, var1, var2, var3)
      # public member function
       def accessProtectedMembers(self):
                # accessing protected member functions of super class
                self._displayProtectedMembers()
# creating objects of the derived class    
obj = Sub("Geeks", 4, "Geeks !")
# calling public member functions of the class
obj.displayPublicMembers()
obj.accessProtectedMembers()
obj.accessPrivateMembers()
# Object can access protected member
print("Object is accessing protected member:", obj._var2)
# object can not access private member, so it will generate Attribute error
#print(obj.__var3)

Output: 

Public Data Member: Geeks
Protected Data Member: 4
Private Data Member: Geeks !

在上面的程序中,accessProtectedMembers()方法是类 Sub 的公共成员函数,访问类 Super 的受保护成员函数 _ displayProtectedMembers()方法,而 accessPrivateMembers()方法是类 Super 的公共成员函数,访问类 Super 的私有成员函数 __displayPrivateMembers()方法。


推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • Linux环境下C语言实现定时向文件写入当前时间
    本文介绍如何在Linux系统中使用C语言编程,实现在每秒钟向指定文件中写入当前时间戳。通过此示例,读者可以了解基本的文件操作、时间处理以及循环控制。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
author-avatar
奥奥奥尼瀚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有