Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性
类属性、实例属性和私有属性
Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍
类属性 / Class Property
类属性在__init__()之外初始化,在外部可以通过类,类实例进行调用, 在内部可以通过类进行调用。
在定义属性的过程中,尽量将各个实例共有的属性定义为类属性,因为定义为实例属性则在每一次实例化时都会初始化一次,为此定义为类属性可以减少内存加快运行速度。
实例属性 / Instance Property
实例属性一般在__init__()内进行初始化,在外部可以通过实例进行调用, 在内部可以通过self进行调用。
私有属性 / Private Property
私有属性可分为两种,
- 单下划线_开头: 只声明这是私有属性,但依然可以从外部进行调用;
- 双下划线__开头: 外部无法直接调用,实际是转换成了_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