zoukankan      html  css  js  c++  java
  • python3之类属性与实例属性

    1、类属性与实例属性

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

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

    2、实例:类属性

    class People(object):
    name = 'jack'
    p = People()#创建实例对象 print(People.name) #通过类对象,打印类属性:name print(p.name) #通过实例对象,打印类属性:name print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
    print(People.__age) #错误,不能在类外通过类对象访问私有的类属性
    运行结果
    jack
    jack
    print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
    AttributeError: 'People' object has no attribute '__age'

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

    class People(object):
        address = 'shandong'
        def __init__(self):
            self.name = 'jack'
            self.age = 20
    p = People() #创建实例对象
    p.age = 12  # 通过实例对象调用实例属性,更改实例属性值
    print(p.age) # 通过实例对象调用实例属性,并打印
    print(p.name) # 通过实例对象调用实例属性,并打印
    print(p.address) # 通过实例对象调用类属性,并打印
    
    print('-----------------调用类属性--------')
    print(People.address)  # 通过类对象调用类属性,并打印
    print(People.name)  # 错误(程序会报错),通过类对象调用实例属性,并打印
    print(People.age)  # 错误(程序会报错),通过类对象调用实例属性,并打印
    结果:
    12
    jack
    shandong
    -----------------调用类属性--------
    shandong
    Traceback (most recent call last):
      File "/Users/admin/Documents/python/test.py", line 14, in <module>
        print(People.name)  # 错误(程序会报错),通过类对象调用实例属性,并打印
    AttributeError: type object 'People' has no attribute 'name'

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

    class People():
        coutry = 'china' #类属性
    print(People.coutry)
    
    p = People()
    print(p.coutry)
    
    p.coutry = 'japan'
    print(p.coutry)  # 实例属性会屏蔽掉同名的类属性:japan
    print(People.coutry)
    del p.coutry # 删除实例属性
    print(p.coutry)    #实例属性被删除后,再调用同名称的属性,会调用类属性:china

    小结:

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

  • 相关阅读:
    阶梯电价、提成、个税计算公式思路解析
    Java单元测试(Junit+Mock+代码覆盖率)
    Spring Cache抽象详解
    关于String 后面跟省略号。。。
    centOS上安装redis
    使用 JMeter 完成常用的压力测试
    调用 jdbcTemplate.queryForList 时出现错误 spring-org.springframework.jdbc.IncorrectResultSetColumnCountException
    C/C++log日志库比较
    QT中使用MinGW 编译的protobuf库--包含库的生成和使用
    win10 下 protobuf 与 qt
  • 原文地址:https://www.cnblogs.com/fat-girl-spring/p/14982046.html
Copyright © 2011-2022 走看看