我们接着讲解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. AWS s3 python sdk code examples

    Yet another easy-to-understand, easy-to-use aws s3 python sdk code examples. github地址:https://github ...

  2. solr 搜索引擎及搜索推荐应用

    搜索框里输入关键字,从mongodb里搜索出关键字相关关键字记录.用户从相关关键字里选取一个作为最后关键字从solr里查询数据. 1创建索引:从sql里goodsinfo表查所有记录,solr.Add ...

  3. windows下载安装MariaDB5.5.32 绿色版

    1.下载地址: http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-5.5.32/win32-packages/mariadb-5.5.32 ...

  4. SignalR安装以及安装问题

    正常节奏 介绍 SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP.NET 平台中. 它提 ...

  5. cocos2d-x 开发中的小问题 在xcode4环境下

    转自:http://hi.baidu.com/baby_66_/item/302353174f19521cd0d66df2 1.如果你在想怎么去搞定程序的开始运行的背景一闪而过的大图 以及icon想换 ...

  6. java float、double精度研究(转)

    在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.o ...

  7. Android中的Handler的机制与用法详解

    概述: 很多android初学者对android 中的handler不是很明白,其实Google参考了Windows的消息处理机制, 在Android系统中实现了一套类似的消息处理机制.在下面介绍ha ...

  8. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  9. H5上传文件

    XMLHttpRequest 在Html5 规范中已经有全新的变化,规定了XMLHttpRequest Level 2规范(目前最新版本)包含下列新的特性: 处理字节流,例如作为上传或者下载的File ...

  10. Linux基础(二)

    二.Linux 常用命令 一.命令行操作的流程 录入命令(可以使用各种途径来发送命令) 命令被解释器解释并执行 将结果以产品需要的方式显示出来 二.命令提示符 sq@sq-VirtualBox:~$ ...