上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问。

本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数)、self.power(动力)、self.totaldistance(累计行驶里程),但在构造方法内只定义了前2个,第3个在其他实例方法中访问。一、类定义

class Vehicle():
   def __init__(self,wheelcount, power):
       self.wheelcount,self.power = wheelcount,power
#构造方法只定义了self.wheelcount,self.power两个实例变量。    def drive(self,distance):
       try:self.totaldistance += distance
       except: self.totaldistance = distance

#drive方法中要根据一次行驶距离计算总行驶里程,但self.totaldistance没有在构造方法定义,因此在drive方法内采用了一个异常处理,确保该实例变量未定义时会执行定义,当然在构造函数内初始化定义该变量是最好的。

def gettotaldistance(self):
        if not hasattr(self,'totaldistance'): self.totaldistance=0;
        return self.totaldistance

#类似drive方法,在gettotaldistance内判断实例是否有'totaldistance'存在,以便对一个未定义的实例变量进行初始化防止程序出错

二、实例化对象及实例变量的访问

我们定义两个实例对象马车和汽车:

hippomobile = Vehicle(2,'马')
car=Vehicle(4,'汽油发动机')

为了方便观察对象的属性,我们定义一个函数dirp取代dir,该函数是将dir返回的带两个下划线开头的属性和方法剔除,因为带两个下划线的属性和方法要么是私有的(双下划线开头,不是双下划线结尾),要么是特殊变量(特殊变量必须以双下划线开头和结尾),特殊变量是可以直接访问的,但因为从Object类继承过来的特殊属性太多,不利于观察自己定义属性,因此剔除:

def dirp(iter): return [i for i in dir(iter) if not i.startswith('__')]

我们用dirp观察hippomobile、car这2个对象的属性和方法,他们都有:

['drive', 'gettotaldistance', 'power', 'wheelcount']

此时执行:

car.oil=0
truck=(4,'汽油发动机')

再用dirp观察,会发现hippomobile保持不变,car多出了一个oil属性,truck的属性与hippomobile一样,可见实例增加的属性对存量对象和新定义的实例对象都不会影响,只影响该实例自身。

我们再执行:truck.drive(100),再用dirp观察,发现truck对象多了一个'totaldistance'属性,而其他对象都没有,可见这个属性是执行方法后变量赋值之后才存在,并不是实例定义之后就存在,如果要变量定义就存在,就需要在构造方法进行初始化。

通过上面案例的说明,实例属性是必须执行赋值语句之后才存在,该赋值语句要么就是实例方法中(不一定是构造方法)的代码,要么就是类体外面的访问实例的代码。

本节老猿介绍了实例变量赋值的方法,并给出了相关案例,内容比较重要但容易理解,请大家结合案例好好理解。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

第7.11节 案例详解:Python类实例变量的更多相关文章

  1. 第7.20节 案例详解:Python抽象类之真实子类

    第7.20节 案例详解:Python抽象类之真实子类 上节介绍了Python抽象基类相关概念,并介绍了抽象基类实现真实子类的步骤和语法,本节结合一个案例进一步详细介绍. 一.    案例说明 本节定义 ...

  2. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  3. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  4. 第7.13节 案例详解:Python类变量

    第7.13节 案例详解:Python类变量 上节介绍了类变量的定义和使用方法,并举例进行了说明.本节将通过一个更完整的例子来说明. 一.    定义函数dirp def dirp(iter): ret ...

  5. 第7.9节 案例详解:Python类封装

    上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person():   ...

  6. 第7.7节 案例详解:Python类继承机制

    本节实现一个类继承的小程序,下面一边结合代码一边介绍相关继承的知识.例子以车.汽车为例,车为父类.汽车为子类. 一.    定义父类Vehicle class Vehicle():    def __ ...

  7. 《spss统计分析与行业应用案例详解》:实例九 单一样本t检验

    单一样本t检验的功能与意义 spss的单一样本t检验过程是瑕设检验中最基本也是最常用的方法之一,跟所有的假没检验一样,其依剧的基木原理也是统计学中的‘小概率反证法”原理.通过单一样本t检验.我们可以实 ...

  8. 《spss统计分析与行业应用案例详解》:实例十二 卡方检验

    卡方检验的功能与意义 SPSS的卡方检验是非参数检验方法的一种,其基本功能足通过样本的 频数分布来推断总体是否服从某种理论分布或某种假设分布,这种检验过程是通过分析实际的频数与理论的频数之间的差别或是 ...

  9. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

随机推荐

  1. 数字取证autopsy系列——保存证据镜像(一)

    简介: 在学习autopsy之前,我们先学习如何将犯罪嫌疑人的磁盘保存为一个证据镜像.我们使用的将磁盘保存为证据镜像的工具为AccessData FTK imager,你可以自行搜索下载. Acces ...

  2. centos6.5开机执行命令

    虚拟机由于用nat方式联网centos6.5,设置了eth0 dhcp,开机没自动获取到IP, 导致secureCRT连不上,所以,让linux开机自动执行下dhclient获取下分配的ip, 这样, ...

  3. 关于vm.min_free_kbytes的合理设置推测

    前言 之前系统出现过几次hung住的情况,没有oom,也没有其它内存相关的信息,而linux设计就是去尽量吃满内存,然后再回收清理的机制 探讨 目前这个参数还没有找到合适的处理这个预留的参数,一般也没 ...

  4. SpringBoot加载配置文件的几种方式

    首先回忆一下在没有使用SpringBoot之前也就是传统的spring项目中是如何读取配置文件,通过I/O流读取指定路径的配置文件,然后再去获取指定的配置信息. 传统项目读取配置方式 读取xml配置文 ...

  5. Map结合Function函数式接口的巧妙之处

    需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果: 例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和, ...

  6. sublime 3 phpfmt配置(大括号对齐)

    默认选项:  default: phpfmt.sublime-settings:         {         "version": 2,         "php ...

  7. CVE-2020-3452 CISCO ASA远程任意文件读取漏洞

    0x01 漏洞描述     Cisco官方 发布了 Cisco ASA 软件和 FTD 软件的 Web 接口存在目录遍历导致任意文件读取 的风险通告,该漏洞编号为 CVE-2020-3452.     ...

  8. 面试腾讯,字节跳动首先要掌握的Java多线程,一次帮你全掌握!

    一.程序,进程,线程联系和区别 其实程序是一段静态的代码,它是应用程序执行的脚本.进程就是程序动态的执行过程,它具有动态性,并发性,独立性.线程是进程调度和执行的单位. 进程:每个进程都有独立的代码和 ...

  9. 如何在PDF文档上加水印

    当我们需要传输一些比较重要的文件时,往往会选择将文档转换为PDF文件,避免其他人复制.更改文档的内容. pdfFactory不仅可以为用户提供快速创建PDF的功能,同时还提供了添加水印的功能.有了水印 ...

  10. 基于Python+requests搭建的自动化框架-实现流程化的接口串联

    框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu ...