我们接着讲解Python的面向对象

  1.初始化实例属性

    在现实生活中,一种类型的实例会具有相同的某些属性,把这些实例划分为一个类型,则这些实例必然有相似的部分。但是,在创建实例之后,我们一个一个的为实例赋予  属  性,这样就显得非常耗时。

    如果我们在定义类的时候,就让他拥有某些共有的属性,那这样就显得轻松多了。

    在定义Person类的时候,可以为类添加一个特殊的__init__()方法,当创建实例时,__init__()方法会被自动调用,这样我们就可以为每个实例都统一加上共有的属性。

    

    注意:__init__()方法的第一个参数必须是self,后续的参数则可以自由指定,当然,在创建实例的时候,就必须要提供除self以外的参数。

    这样,有了__init__()方法,每个实例在创建的时候,都会具有这些共有的属性。

    实例访问属性的时候,使用‘.’操作符。即“对象.属性”,xiaoming.name。

    如果忘记了写self参数,程序就会出现以下错误:

    

  接下来我们谈谈访问控制

  2.访问控制

    一个实例对象可以绑定很多属性,但是有些属性我们并不像让外面的世界知道,这时我们就要对这些属性进行访问权限的控制,那么Python是怎么进行访问控制的    呢!!!

    Python对属性的权限控制是通过属性名来实现的,如果一个属性由双下划线(__)开头,则该属性就无法被外部访问。

  

  从上面代码,可知,只有以双下划线开头的“__work”,不能直接被外部访问。

  但是,如果一个属性以“__xxx__”形式定义,那它又可以被外部访问了。

  “__xxx__”形式在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不把普通属性用“__xxx__”定义。

  

  如果把实例化时传入的参数赋值给一个“__xxx”的属性,看是否能从外部访问?

    

  从上面代码的执行结果可以看出,并不能被外部访问。

  3.创建类属性

    类是模板,而实例则是根据类创建的对象。

    绑定在实例上的属性不会影响其他实例,但是,类本身也可以看做是一个对象,那么,如果在类上绑定一个属性,则所有的实例都可以访问类的属性,并且,所有的实例访  问的类属性都是同一个,换言之,实例属性每个实例各自拥有,相互独立,而类属性有且只有一份。

    定义类属性:

    

    从上面的代码可以看出,类属性可以直接在class中定义(address = 'Earth'),所以访问类属性时,不需要创建实例,直接通过类名就可以访问 Person.address

    当然,对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性。

      

    注意:

    由于Python是动态语言,类属性也是可以动态添加和修改的

    

    因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了!

  

  4.类属性和实例属性名字冲突问题

    修改类属性会导致所有实例访问到的类属性全部都受影响,如果在实例变量上修改类属性会发生什么呢!!!

    

    从上面代码,我们可以看出,实例变量上修改类属性,并不影响其他实例和类的类属性,只有该实例进行了变化,这是怎么回事呢!!

    其实是p1.address = 'China' 并没有改变Person的address,而是给p1这个实例绑定了实例属性address,值为'China',而它所属的类也有一个类属性address,所以访  问p1.address时,优先查找实例属性,返回‘China’,访问p2.address时,p2没有实例属性address,但是有类属性address,因此返回'Earth'。

    

    当我们把p1的address实例属性删除后,访问p1.address就又返回类属性的值‘Earth’了。

    总结:

    @1.当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

     @2.不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

Python的面向对象2的更多相关文章

  1. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  2. Python的面向对象3

    接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...

  3. Python的面向对象1

    今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++  ,Java  ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...

  4. My way to Python - Day05 - 面向对象-思维导图

    My way to Python - Day05 - 面向对象   思维导图

  5. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  6. Python之面向对象一

    引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...

  7. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  8. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  9. python基础——面向对象的程序设计

    python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

随机推荐

  1. 【转】浅谈HTTP中Get与Post的区别

    转自:http://www.cnblogs.com/hyddd Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以 ...

  2. 【转】Cocos2d-x 2.x CCSprite 灰白图的生成(利用shader设置)——2013-08-27 21

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=325 游戏中人物死掉后要把人物头 ...

  3. RPM vs SRPM

    RPM 全名是『 RedHat Package Manager 』简称则为 RPM 啦!顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的. RPM 是以一种数据库记录的方式来将 ...

  4. DotNetTextBox使用方法步骤

    对于使用这个控件的研究我是用4个小时的工作终于完成成功了 现在请允许我在这里和你讲讲这个控件的使用方法 第一首先要从百度或是谷歌里下载一个dotnetTextBox第三方控件在解压后里面有三个文件 分 ...

  5. 【邮件】imap与pop3的区别

    文:铁乐猫 2015 10月14日 今天替一位在外出差的用户安装和设置完foxmail用于收发邮件,到下午被告知对方用foxmail发完邮件后,在网页上登录邮箱后并没有看到在foxmail中" ...

  6. Extjs combobox设置默认值

    转载:http://www.54mask.com/extjs-combobox-default-value.html 相信很多人都遇到了在ExtJS框架中设置combo组件默认值的需求,ExtJS框架 ...

  7. 达夫设备/达夫算法(Duff's Device)

    主要是下面的代码: register n = (count + 7) / 8;   /\* count > 0 assumed \*/ switch (count % 8) { case 0:  ...

  8. Redis Cache 简介

    Microsoft Azure Redis Cache 是基于流行的开源Redis Cache 1.Microsoft Azure Redis Cache 可分为以下几个级别: Basic – 单节点 ...

  9. WPF窗体视图中绑定Resources文件中字符串时,抛出:System.Windows.Markup.StaticExtension

    问题描述: 在Resources.resx定义了一个静态字符串字段Title,并在WPF窗体视图中绑定为窗体的标题: Title="{x:Static local:Resources.Tit ...

  10. android使用广播退出应用程序

    由于在(Widget或Service.BroadcastReceiver中)使用startActivity()方法启动activity时需使用FLAG_ACTIVITY_NEW_TASK flag,所 ...