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


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


    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
  • 相关阅读:
    govalidator----结构体tag验证
    结构字段验证--validator.v9
    序列化
    案例:8,64,256都是2的阶次方数(8是2的3次方),用Java编写程序来判断一个整数是不是2的阶次方数。
    易错点
    什么是线程与进程?
    对象与实例的区别?
    什么情况下用断言?assert
    垃圾收集器什么时候回收垃圾?
    HashMap 和 HashTable 的区别
  • 原文地址:https://www.cnblogs.com/stacklike/p/8093337.html
Copyright © 2020-2023  润新知