美文网首页
Python3 - 在类中封装属性名

Python3 - 在类中封装属性名

作者: 惑也 | 来源:发表于2018-12-25 00:04 被阅读27次

问题

封装类的实例的“私有”数据,但是Python语言并没有访问控制。

解决方案

Python程序员不是依赖语言特性去封装数据,而是通过遵循一定的属性和方法命名规范,来达到这个效果。

任何以单下划线(_)开头的名字都应该是内部属性。比如:

class A(object):
    def __init__(self):
        self._internal = 0  # An internal attribute
        self.public = 1   # A public attribute

    def public_method(self):
        pass

    def _internal_method(self):
        pass

Python并不会真的阻止别人访问内部名称(属性)。使用下划线开头的命名规范同样适用于模块名和模块级别函数。

使用双下划线(__)开头的名字,也都是内部属性,且会导致访问名称变成其他形式,比如:

class B(object):
    def __init__(self):
        self.__private = 0

    def __private_method(self):
        pass

    def public_method(self):
        pass
        self.__private_method()

示例中,访问双下划线(__)开头的私有属性时,会被分别重命名为 _B__private_B__private_method 。其目的就是类继承时,这些私有的属性或方法不会被覆盖。

讨论

单双下划线开头的属性和方法命名规范,都是用来命名私有属性,通常情况下,非公共名称以单下划线开头进行命名,如果考虑代码会涉及到子类时,并且有些内部属性应该在子类中隐藏起来,那么才考虑使用双下划线开头的命名方式。

有时候,定义一个变量时,考虑可能与某个保留关键字冲突,可以使用单下划线作为后缀,例如:

lambda_ = 2.0   # Trailing _ to avoid clash with lambda keyword

这里并不使用单下划线前缀的原因,是避免误解它的使用初衷,被理解为这个属性是私有的。

相关文章

  • Python3 - 在类中封装属性名

    问题 封装类的实例的“私有”数据,但是Python语言并没有访问控制。 解决方案 Python程序员不是依赖语言特...

  • Python类中属性搜索的顺序

    Python类中属性搜索的顺序 在传统类中(默认类,直到Python3),属性搜索处理对所有路径深度优先,直到继承...

  • 二、面向对象

    1 类的基本使用 python3中写成class 类名会自动解析为新式类class 类名(object) 2 类中...

  • 面向对象02-封装

    面向对象02-封装 [TOC] 好处 广义的封装:方法、类、包狭义的封装:类中的属性的封装 封装的具体体现 规范 代码

  • 类与结构体

    在 OC 中:1.结构体只能封装属性,而类不仅可以封装属性还可以封装方法.2.结构体变量分配在栈,OC 对象分配在...

  • 简单Java类

    对于简单Java类,第一种开发要求:类名必须存在有意义,例如:Book类之中所有的属性必须private封装,封装...

  • HTML5 新增内容和 API

    classList 属性 该属性用于在元素中添加,移除及切换 CSS 类。 classList 属性返回元素的类名...

  • (八)方法的继承、重写和扩展

    一、继承 1.封装与继承的概念 封装:根据需求将属性和方法封装到一个抽象的类中;继承:获得父类的属性和方法,实现代...

  • vue项目中遇到的问题总结

    主要内容 类名的用法 computed计算属性 与methods watch介绍和场景 组件的封装和传值 类名的用...

  • 5.6~1方法

    在封装一个类时,不仅要定义出该类的属性,更为重要的是封装该类的方法。本节就来详细介绍在类中如何封装方法5.6.1方...

网友评论

      本文标题:Python3 - 在类中封装属性名

      本文链接:https://www.haomeiwen.com/subject/uhztlqtx.html