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


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

Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性的更多相关文章

  1. 第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?

    第7.25节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样? 一.    案例说明 我们上节提到了,使用property函数定义的属性不要与类内已经定义的普通实例变量重 ...

  2. Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法

    类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ...

  3. Python的程序结构[5] -> 模块/Module[0] -> 内建模块 builtins

    builtins 内建模块 / builtins Module 在Python的模块中,有一种特殊模块,无需导入便可以使用,其中包含了许多内建函数与类. builtins 模块内容 / builtin ...

  4. Python的程序结构[3] -> 变量/Variable[0] -> 变量类型

    变量类型 / Variable Type 在 Python 中,变量主要有以下几种,即全局变量,局部变量和内建变量, 全局变量 / Global Variable 通常定义于模块内部,大写变量名形式存 ...

  5. Python的程序结构[4] -> 函数/Function[0] -> 函数与方法的区别

    函数与方法的区别 / Distinction of Function and Method 关于函数与方法的区别,可根据两者的定义看出, 函数function -- A series of state ...

  6. Python的程序结构[2] -> 类/Class[0] -> 类的特殊属性

    类的特殊属性 / Special Property of Class Python 中通过 class 进行类的定义,类可以实例化成实例并利用实例对方法进行调用. 类中还包含的一些共有的特殊属性. 特 ...

  7. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

  8. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  9. Python的程序结构[2] -> 类/Class[1] -> 基类与继承

    基类与继承 / Base Class and Inheritance Class 面向对象的特性使得 Python 中不可避免地需要使用到类和类的继承,类的继承可以使得代码很好的被重用.下面以一些代码 ...

随机推荐

  1. vim基本配置备份

    我的vim基本配置如下,在这里作个备份: set background=light syntax on set number set smartindent set expandtab set tab ...

  2. Python 3基础教程8--if else、if elif else

    本文介绍if else语句,不多说,直接看例子. if elif else语句

  3. Jmeter日期

    有的时候我们接口中会有需要传递日期的参数,这是jmeter工具中给我准备一个 日期函数_time,如下图所示: 取到的将会是年月日 对应的写法有 yyyy-MM-dd HH:mm:ss  ---年月日 ...

  4. 孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase

    孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase (完整学习过程屏幕记录视频地址在文末) 之前对关系型数据库的学习告一段落,虽然能力所限没有能够完全完成理想中的所有数据库操 ...

  5. 1099 Build A Binary Search Tree (30 分)(查找二叉树)

    还是中序遍历建树 #include<bits/stdc++.h> using namespace std; ; struct node { int data; int L,R; }s[N] ...

  6. LightGBM的并行优化--机器学习-周振洋

    LightGBM的并行优化 上一篇文章介绍了LightGBM算法的特点,总结起来LightGBM采用Histogram算法进行特征选择以及采用Leaf-wise的决策树生长策略,使其在一批以树模型为基 ...

  7. STL之set&multiset使用简介

    关于set,必须说明的是set关联式容器.set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注 ...

  8. Redis String

    Redis String Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME ...

  9. 获取JNDI数据源

    1 在容器中配置数据源 Tomcat <?xml version="1.0" encoding="UTF-8"?> <Context> ...

  10. 少年Pi的奇幻漂流

    选择怀疑作为生活哲学就像选择静止作为交通方式.   的确,我们遇见的人可能改变我们,有时候改变如此深刻,在那之后我们成了完全不同的人,甚至我们的名字都不一样了. 声音会消失,但伤害却留了下来,像小便蒸 ...