python调用私有属性的方法总结

作者:流芳 时间:2023-09-06 03:16:18 

当我们定义一个类的时候,有时候会定义一个私有属性来辅助开发。在其它语言中经常会用到 private 来修饰这个属性为私有属性。可是你知道么?同样为私有属性,有的开发语言中是真私有属性,有的是假私有属性。

例如 :在 OC 开发过程中出现的私有属性就是假私有属性,通过 runtime 可以很方便拿到私有属性并进行修改。同出师门,swift 中的私有属性就是真私有属性,通常需要 private 来修饰。

那么在 python 开发中,我们如何来定义一个私有属性呢?作为约定俗成,我们通常在属性的前面加两个下划线,即__age就代表是一个私有属性。

也许你会有疑问,这个属性是真私有属性还是假私有属性?

首先我们定义一个类,并在该类中初始化两个属性,其中一个为私有属性。如下所示:


class Person(object):
# 构造函数
def __init__(self, name):
    self.name = name
    self.__age = 18

创建一个对象,并给初始化name 属性。


obj = Person("lily")
print(obj.name)

运行该模块就会打印出:lily

那么私有属性该如何访问:

print(obj.__age)

运行模块之后,控制台会打印出:

'Person' object has no attribute '__age'

既然 age作为私有属性,所以该属性就不能直接访问。

正确调用方法为:

print(obj._Person__age)

控制台就可以打印出:18

同样,可以重新给私有属性赋值

obj._Person__age = 20

print(obj._Person__age)

控制台就可以打印出:20

如果我们另外创建一个类并继承 Person,该如何访问自己的私有属性并做修改呢?


class Student(Person):
    def __init__(self):
        self.__gender = 'male'
        stu = Student()
        print(stu._Student__gender)

控制台会打印出来:male

如果访问父类的私有属性呢?

print(stu._Person__age)

这个时候,控制台会打印:'Student' object has no attribute '_Person__age'

这进一步证明了,私有属性是无法被继承的。

由此可知,在 Python 中私有属性为假私有属性。那为什么不从语法上保证 private 字段的私密性呢?用最简单的一句话来说:We are all consenting adults here。正如Python 程序员的观点:开放要比封闭好。

综上所述:

Python 编译器无法严格保证 private 字段的私密性。

只有当子类不受自己控制的时候,才可以考虑使用 private 属性来避免名称冲突。

实例扩展:


#! encoding=UTF-8

class A:
 def __init__(self):

# 定义私有属性
   self.__name = "wangwu"

# 普通属性定义
   self.age = 19

a = A()

# 正常输出
print a.age

# 提示找不到属性
print a.__name

执行输出:

Traceback (most recent call last):
File "C:\Users\lee\Documents\Aptana Studio 3 Workspace\testa\a.py", line 19, in <module>
print a.__name
AttributeError: A instance has no attribute '__name'

来源:https://www.py.cn/jishu/gaoji/19472.html

标签:python,私有属性
0
投稿

猜你喜欢

  • 用Vue编写抽象组件的方法

    2024-05-10 14:10:30
  • Python编程中对文件和存储器的读写示例

    2022-04-27 06:26:35
  • 如何编写python的daemon程序

    2023-07-27 05:13:28
  • python线程信号量semaphore使用解析

    2023-02-08 08:47:24
  • Python绘制堆叠柱状图的实例

    2022-01-04 06:14:55
  • 利用Pandas读取表格行数据判断是否相同的方法

    2022-07-30 22:10:20
  • Python脚本实时处理log文件的方法

    2021-02-23 06:40:32
  • 基于mysq字段选择的详解

    2024-01-23 20:11:20
  • 小米正式开源 SQL 智能优化与改写工具 SOAR

    2024-01-20 09:34:56
  • MySQL 按指定字段自定义列表排序的实现

    2024-01-16 08:09:22
  • 讲解设计应用程序时避免阻塞的八个准则

    2009-01-04 14:16:00
  • Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】

    2023-05-14 08:03:02
  • Python读取csv文件实例解析

    2023-01-21 07:47:32
  • 如何将多宿主计算机配置为允许SQL Server访问

    2011-01-04 14:04:00
  • 详解Python进行数据相关性分析的三种方式

    2022-05-09 18:50:12
  • 快速入手Python字符编码

    2022-05-26 00:52:33
  • bootstrapValidator.min.js表单验证插件

    2024-04-10 13:53:46
  • pycharm显示远程图片的实现

    2021-03-02 13:27:39
  • vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例

    2023-07-02 16:28:28
  • Firefox下无法正常显示年份的解决方法

    2024-04-18 09:39:50
  • asp之家 网络编程 m.aspxhome.com