Python的面向对象2
我们接着讲解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的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Python的面向对象3
接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外 ...
- Python的面向对象1
今天,我们来介绍Python的面向对象编程,其实面向对象并不陌生,在C++ ,Java ,PHP中也有大量使用! 好了,我们来步入正题! 那什么是面向对象编程呢? 1. 面向对象编程是一种程序设计 ...
- My way to Python - Day05 - 面向对象-思维导图
My way to Python - Day05 - 面向对象 思维导图
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
随机推荐
- AndroidのUI设计研究(一)——自定义ProgressBar
最近迷上进度条,使用进度条可以增强用户体验,让用户心里有个底,再无奈的等待中体会loading的乐趣. 记得以前优乐美的官网,进入主页加载资源,显示给用户看的就是,炫彩背景下,一个杯子里的奶茶随着加载 ...
- insert into ... on duplicate key update 与 replace 区别
on duplicate key update:针对主健与唯一健,当插入值中的主健值与表中的主健值,若相同的主健值,就更新on duplicate key update 后面的指定的字段值,若没有相同 ...
- Android(java)学习笔记165:Android的Junit调试
编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题 ...
- Linux启动遇到的问题
双系统装的Ubuntu,在一次意外关机后无法进入图形界面,每次输入完密码进入桌面后又会退到密码输入界面.使用命令行df -hl查看发现根目录使用率达到100%.推测是因为意外关机导致的,但是找不到应该 ...
- linux部署tomcat
安装说明 安装环境:CentOS-6.5安装方式:源码安装 软件:apache-tomcat-6.0.45.tar.gz下载地址:http://tomcat.apache.org/download-6 ...
- log4j中存在日志无法打印问题解决
我在项目中配置双数据中心,原来类包名称前最都是一致的,后来由于项目的需要根据数据来源命名不同的类包名称,这个导致一个问题,sql语句运行无法正常打印出来,提示以下内容: log4j:WARN No a ...
- linux下grep命令笔记
grep -i 不区分大小写 --color 添加颜色 alias grep=‘grep --color=auto’ -v 显示没有被模式匹配到的行 -o 只显示 ...
- JUnit4简要说明
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证. 开发者编写一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 通常而言,一个单元测试是用于判断某个特定 ...
- Scala中class和object的区别
1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C ...
- wampserver修改mysql密码后phpmyadmin登陆错误处理方法
首先针对wampserver这个软件来说,是很方面的! 在进行使用时都会涉及到关于mysql数据管理系统的相关密码的修改,这个当然修改是很简单,当时没有想那么多,想为自己的mysql添加一个密码,方式 ...