热门标签 | 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()方法。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
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社区 版权所有