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

本节定义一个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. markdown语法入门笔记

    Markdown 是一种轻量级标记语言 1.标题 # ## ... ###### 分别为1到6级标题 (#后要加空格) 7个以上的#的没有效果 阿萨德阿萨德 阿萨德 2.字体 *斜体文本* _斜体文本 ...

  2. 9.集合set和frozenset冻结集合函数

    集合set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以在set中没有重复的key. 集合中的元素要求是不可变的并且还是唯一的,我们就利用它是唯一来做去重. ...

  3. Spider_基础总结5--动态网页抓取--元素审查--json--字典

    # 静态网页在浏览器中展示的内容都在HTML的源码中,但主流网页使用 Javascript时,很多内容不出现在HTML的源代码中,此时仍然使用 # requests+beautifulsoup是不能够 ...

  4. mysql查询上月天数/当月第一天/上月第一天

    select (DATEDIFF(DATE_ADD(curdate(), INTERVAL - DAY(curdate())+ 1 DAY), date_add(curdate()- DAY(curd ...

  5. spring 2.5 基础知识和与其他框架的集成

    spring环境搭建: 一:导入spring2.5所需的包,在classpath目录下建一个名为"beans.xml"模板文件: <?xml version="1. ...

  6. Adaboost算法的一个简单实现——基于《统计学习方法(李航)》第八章

    最近阅读了李航的<统计学习方法(第二版)>,对AdaBoost算法进行了学习. 在第八章的8.1.3小节中,举了一个具体的算法计算实例.美中不足的是书上只给出了数值解,这里用代码将它实现一 ...

  7. Oracle 集合类型

    集合类型 1. 使用条件: a. 单行单列的数据,使用标量变量 .    b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ]   c. 单列多行数据,使用集合 *集合:类似于编程语言中 ...

  8. 【python爬虫】用requests库模拟登陆人人网

    说明:以前是selenium登陆取cookie的方法比较复杂,改用这个 """ 用requests库模拟登陆人人网 """ import r ...

  9. Python_字符串_方法

    #字典#把字符串中的字母提取出来改为大写并计数 a="aAsmr3idd4bgs7Dlsf9eAF" b1=[x for x in a if x.isalpha()] b=''.j ...

  10. Service Cloud零基础学习(二)Entitlement & MileStone

    https://trailhead.salesforce.com/content/learn/modules/entitlements 很少会有人不买东西,买的多了也很少没有人没有经历过售后流程.我们 ...