博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 类的属性与实例属性
阅读量:5983 次
发布时间:2019-06-20

本文共 1739 字,大约阅读时间需要 5 分钟。

放假归来 ~~~


一、概念

  • 类对象:类名
  • 实例对象:通过类创建的对象
  • 类属性:类对象所拥有的属性。归类所有,被类对象和实例对象所共有。
    类的公有属性可以在类外被访问。
  • 实例属性:实例对象所特有的属性,类对象不能拥有,即不能通过类对象调用。
    实例属性可以放在构造方法__init__()中,也可以在创建实例对象后,进行绑定。

二、举例说明

我们通过创建一个学生类来进行说明。

class Student1(object):    version = 1.0                        # 类的公有数据属性    __v = 66                            # 类的私有数据属性        # 构造方法里的实例属性,在类创建实例时自动被调用    def __init__(self ,name,score):                self.name = name         self.score = score         # 类的方法属性,通过类实例化对象访问    def updateScore(self,new_score):            self.score = new_score

then,尝试通过类对象和实例对象来访问类的公有数据属性。对于实例没有而类有的属性,会继续查找类的属性。

>>> b = Student1('xlp','100')   >>> Student1.version            # 通过类来访问类的数据属性1.0>>> b.version                    # 通过类实例访问类的数据属性,打印version属性 1.0                    # 因为实例并没有该属性,所以会继续查找class的version属性

but,当类属性和实例属性相同且混用的时候,会出现点问题。

我们先通过类来修改类的数据属性。修改后,类和实例对象均可访问。

>>>Student1.version += 0.1    >>>Student1.version         # 或者b.version1.1

再通过类实例对象来修改类属性:

>>>b.version += 0.1            # 试图通过类对象来修改类属性>>>b.version                # 效果等同于b.version = Student.version + 0.11.2                 # 由于实例属性优先级高于类属性,因此会屏蔽掉类的version属性 1.1>>>Student1.version 1.1                 # 此时Student.version仍为1.1

其实,在上面实例对象修改类数据属性时,创建了一个名为version的新实例属性,覆盖了类属性的引用。

但是类本身的数据属性没有受到影响,仍存在类域中,可以通过类属性访问。
如果将b.version属性进行删除del,之后b.version就可以重新访问类数据属性了。

>>>del b.version            # 删除实例属性>>>b.version             # 由于实例的version属性没有找到,类的属性就显示出来了1.1

所以,实例属性和类属性不要使用相同的名字。因为相同名称的实例属性将屏蔽掉类属性。

可以通过实例绑定、访问实例的属性,举例说明:

>>> b.name                    'xlp'>>>b.updateSocore(100)        # 通过实例访问类方法属性>>>b.score100

但是,但是,但是,当类数据属性为可变对象时,比如dict类型,情况又会有点不一样了。例如:

clipboard.png

当类属性为可变对象时,通过实例对象来修改类属性时,会修改类属性,且在删除实例属性时会报错。

所以,使用类对象来修改类属性,不要使用实例对象来修改类属性。


❤ thanks for watching, keep on updating...

点个赞再走吧

转载地址:http://wmrox.baihongyu.com/

你可能感兴趣的文章
css判断不同分辨率显示不同宽度布局实现自适应宽度
查看>>
jQueryMobile开发时,遇到的一些问题记录
查看>>
mongodb日志按天拆分。
查看>>
iOS的问题及解决办法
查看>>
把代码执行演示嵌在你的PPT中
查看>>
函数的指针
查看>>
Hibernate上路_10-持久化对象操作
查看>>
教你如何改变 Mac 终端背景与命令的颜色
查看>>
Java对象占用内存大小
查看>>
mysql相关
查看>>
通过yeoman创建React-webpack项目
查看>>
Linux安全之iptables详解
查看>>
Mysql数据库死锁的解决办法
查看>>
[ubuntu] how to enable BCM4311 driver
查看>>
利用本地安全策略全面禁止360等特定厂商软件的安装与运行
查看>>
Java面试题之五 (转)
查看>>
iOS程序启动原理简单说明
查看>>
面向GC的Java编程
查看>>
Android SDK开发包国内下载地址-AndroidDevTools
查看>>
从零搭建LNMP环境(二) - 集成Nginx与PHP
查看>>