zoukankan      html  css  js  c++  java
  • python(七):python的类属性和实例属性

    1、类属性与实例属性

      类属性就相当与全局变量,实例对象共有的属性实例对象的属性为实例对象自己私有

      类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问。

    2、实例:类属性

    复制代码
     1 class People(object):
     2     name = 'Jack'  #类属性(公有)
     3     __age = 12     #类属性(私有)
     4 
     5 p = People()    #创建实例对象
     6 
     7 print(p.name)           #通过实例对象,打印类属性:name
     8 print(People.name)      #通过类对象,打印类属性:name
     9 print(p.__age)            #错误,不能在类外通过实例对象访问私有的类属性
    10 print(People.__age)        #错误,不能在类外通过类对象访问私有的类属性
    11 
    12 #结果如下:
    13 # Jack
    14 # Jack
    15 # AttributeError: 'People' object has no attribute '__age'
    16 # AttributeError: type object 'People' has no attribute '__age'
    复制代码

    3、实例:实例属性(对象属性)

    复制代码
     1 class People(object):
     2     address = '山东'  # 类属性
     3     def __init__(self):
     4         self.name = 'xiaowang'  # 实例属性
     5         self.age = 20  # 实例属性
     6 
     7 p = People()    #创建实例对象
     8 p.age = 12  # 通过实例对象调用实例属性,更改实例属性值
     9 print(p.address)  # 通过实例对象调用类属性,并打印
    10 print(p.name)  # 通过实例对象调用实例属性,并打印
    11 print(p.age)  # 通过实例对象调用实例属性,并打印
    12 
    13 #结果:
    14 # 山东
    15 # xiaowang
    16 # 12
    17 
    18 print(People.address)  # 通过类对象调用类属性,并打印
    19 print(People.name)  # 错误(程序会报错),通过类对象调用实例属性,并打印
    20 print(People.age)  # 错误(程序会报错),通过类对象调用实例属性,并打印
    21 
    22 #结果:
    23 # 山东
    24 # AttributeError: type object 'People' has no attribute 'name'
    25 # AttributeError: type object 'People' has no attribute 'age'
    复制代码

    4、通过实例(对象)去修改类属性

    复制代码
     1 class People(object):
     2     country = 'china'  # 类属性
     3 
     4 print(People.country)   #china
     5 p = People()
     6 print(p.country)    #china
     7 p.country = 'japan' 
     8 print(p.country)  # 实例属性会屏蔽掉同名的类属性:japan
     9 print(People.country)   #china
    10 del p.country  # 删除实例属性
    11 print(p.country)    #实例属性被删除后,再调用同名称的属性,会调用类属性:china
    复制代码

    小结:

      如果需要在类外修改类属性必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

  • 相关阅读:
    Visual Studio Installer打包安装项目VS2015
    在WinCE上播放声音、设置透明图片、系统音量 C#
    虚函数、抽象函数以及接口的区别
    Type 'System.IO.FileStream' with data contract name 'FileStream:http://schemas.datacontract.org/2004/07/System.IO' is not expected.
    项目中重新引用WCF报错
    为什么0.1+0.2=0.30000000000000004
    MVC自定义错误页404静态页
    DP 网易内推:合唱团
    TFBOY 养成记 一些比较好多文章。
    机器学习笔记:为什么要对数据进行归一化处理?
  • 原文地址:https://www.cnblogs.com/zhangxianrong/p/14809039.html
Copyright © 2011-2022 走看看