类属性、实例属性和私有属性


Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍

类属性 / Class Property


类属性在__init__()之外初始化,在外部可以通过类,类实例进行调用, 在内部可以通过进行调用。

在定义属性的过程中,尽量将各个实例共有的属性定义为类属性,因为定义为实例属性则在每一次实例化时都会初始化一次,为此定义为类属性可以减少内存加快运行速度

实例属性 / Instance Property


实例属性一般在__init__()内进行初始化,在外部可以通过实例进行调用, 在内部可以通过self进行调用。

私有属性 / Private Property


私有属性可分为两种,

  1. 单下划线_开头: 只声明这是私有属性,但依然可以从外部进行调用;
  2. 双下划线__开头: 外部无法直接调用,实际是转换成了_classname__propertyname

私有属性不仅无法在外部直接进行调用,在继承时也无法相互访问私有属性,即子类无法直接继承父类私有属性,父类也无法直接访问子类的私有属性。

代码示例


以一个例子来介绍这三种属性的区别,

 class Foo():
classProperty = 'classProperty'
_privatePropertyCallable = 'privatePropertyCallable'
__privateProperty = 'privateProperty'
def __init__(self):
self.instanceProperty = 'instanceProperty'
self.__privateProperty = 'selfPrivateProperty'

首先定义了一个 Foo 类,并在类中定义了三个类属性,和两个实例属性,其中 classProperty 为普通的类属性,而 _privatePropertyCallable 和 __privateProperty 为私有的类属性;同理,在初始化方法中,self.instanceProperty 为普通的实例属性,而 self.__privateProperty 为实例的私有属性,

定义完成后对上面的 5 个属性分别进行调用,

 # Call class property
print(Foo.classProperty)
print(Foo().classProperty)
# Call instance property
print(Foo().instanceProperty)
# Call private property
print(Foo._privatePropertyCallable)
print(Foo._Foo__privateProperty)
print(Foo()._Foo__privateProperty)

第 2 和第 3 行用类和类实例两种方式分别调用类属性,

第 5 行用实例调用实例属性,值得注意的是,此处无法使用 Foo.instanceProperty 的方式来调用实例属性,

第 7 行用类的方式调用了单下划线声明的私有属性,虽然可以实现调用,但在实际使用中却不被推荐,

第 8 / 9 行则分别以类和类实例的方式,通过类名强行调用了各自的私有属性。

最终的输出依次结果为

classProperty
classProperty
instanceProperty
privatePropertyCallable
privateProperty
selfPrivateProperty

最新文章

  1. 问题解决——MFC Ribbon 添加图标
  2. 【Python⑥】python的缩进,条件判断和循环
  3. IntelliJ IDEA 自动化工具安装并添加自动化测试框架
  4. jquery easyui校验select下拉列表值是否为空的问题
  5. B站运维团队成长的血泪史
  6. 彻底弄懂css中单位px和em,rem的区别 转的自己看
  7. ODBC,实现图片循环写入Oracle数据库
  8. Android各种颜色dawable.xml中定义
  9. js查找和过滤
  10. windows 2003 server 安装 .NET Framework 2.0环境
  11. 如何利用Python网络爬虫抓取微信朋友圈的动态(上)
  12. vue3+typescript引入外部文件
  13. 网络流之最大流Dinic算法模版
  14. 18.21 关键字extern
  15. Spark源码剖析 - 计算引擎
  16. Go Example--锁
  17. Python之重复执行
  18. extgcd 扩展欧几里得算法模板
  19. 41 Pain and Pain Management 疼痛与疼痛管理
  20. 面试题41:和为s的两个数字 || 和为s的连续正数序列

热门文章

  1. obj = object(),所创建的obj实例到底是个啥?
  2. HashMap 的深入学习
  3. realloc在aarch64_be-gcc的奇怪表现
  4. linux服务进程管理
  5. Java进行身份证格式强校验(准)
  6. 【bzoj2618】[Cqoi2006]凸多边形 半平面交
  7. 【距离GDOI:128天】【POJ2778】DNA Sequence(AC自动机+矩阵加速)
  8. POJ2374 Fence Obstacle Course 【线段树】
  9. sass mixin 持续更新
  10. AE中实现Control中的各种图形工具的方法