Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性

时间:2022-03-13 12:08:42

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


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

 

类属性 / Class Property


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

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

 

实例属性 / Instance Property


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

 

私有属性 / Private Property


私有属性可分为两种,

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

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

 

代码示例


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

 1 class Foo():
 2     classProperty = 'classProperty'
 3     _privatePropertyCallable = 'privatePropertyCallable'
 4     __privateProperty = 'privateProperty'
 5     def __init__(self):
 6         self.instanceProperty = 'instanceProperty'
 7         self.__privateProperty = 'selfPrivateProperty'

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

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

1 # Call class property
2 print(Foo.classProperty)
3 print(Foo().classProperty)
4 # Call instance property
5 print(Foo().instanceProperty)
6 # Call private property
7 print(Foo._privatePropertyCallable)
8 print(Foo._Foo__privateProperty)
9 print(Foo()._Foo__privateProperty)

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

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

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

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

最终的输出依次结果为

classProperty
classProperty
instanceProperty
privatePropertyCallable
privateProperty
selfPrivateProperty