面向对象【day07】:类的特性介绍(四)
本节内容
1、概述
2、访问属性
3、私有属性
4、总结
一、概述
在上篇博客中我们已经讲了一些关于类的知识,我们来回顾以下:
- 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
- __init__()构造函数
- self.name = name 被称为属性、成员变量、字段
- def sayhi(self) 被称为方法、动态属性
下面我们继续学习类的特性。
二、访问类属性
2.1 成员变量和参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name #类的成员变量 def sayhi( self ): print ( "the dog {0} is sayhi" . format ( self .name)) def eat( self ,food): #传入一个参数,参数名:food print ( "the dog name is {0},it like food is {1}" . format ( self .name,food)) d = dog( "alex" ) #实例化对象 d.sayhi() #调sayhi方法 d.eat( "hotdog" ) #调eat方法 #输出 the dog alex is sayhi the dog name is alex,it like food is hotdog |
①很多人产生疑问,为什么eat方法里面会传入一个food的参数名呢?而这个为什么不能再其他方法里面用呢?而self.name就可以呢?
因为food它只是作为eat方法的一个参数,不是类的成员变量,只能在自己的方法里面使用,而self.name是类的成员变量,它是类的属性,所以可以被调用。
②为什么类的每一个方法第一个参数都是self呢?
是因为类在实例化的时候,需要把实例对象本身传进来,好去调用对象本身的属性和方法。
2.2 修改对象的属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name,age): self .name = name self .age = age def sayhi( self ,update_age): #传入一个update_age参数 self .age = update_age #修改对象的age属性 d = dog( "alex" , 18 ) d.sayhi( 22 ) #第1次在类的方法中修改 print (d.age) d.age = 19 #第2次在类外面修改 print (d.age) #输出 22 19 |
注:就是说在类的方法中或者类的外面都可以修改类的属性
三、定义私有属性
说明:之前我们说,我们可以访问类的属性,也可以随意修改类的属性,但是类属性一旦被定义成私有的,对外是不可以被访问的,也是不可以随意被改变的。
3.1 定义私有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name,age): self .name = name self .age = age self .__sex = "man" #定义私有属性__sex def sayhi( self ,update_age): self .age = update_age d = dog( "alex" , 18 ) print (d.__sex) #访问私有属性__sex #输出 Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day6/封装.py" , line 16 , in <module> print (d.__sex) AttributeError: 'dog' object has no attribute '__sex' #报错,说没有__sex这个属性 |
从上面的例子可以看出,私有属性是不可以访问的,更不可以修改。但是我们就想访问,但是不去修改,我们怎么办呢?
3.2 get方法访问私有属性
虽然我们外部不能访问私有属性,但是我们在类内部可以访问私有属性,所以我们用如下方法,访问私有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name self .__sex = "man" #定义私有属性sex def get_sex( self ): #定义get方法 return self .__sex #返回私有属性sex值 d = dog( "alex" ) d_sex = d.get_sex() #调用实例对象d的get_sex()方法获取私有属性sex print (d_sex) #输出 man |
注:这种方法只能访问私有属性,但是不能更改私有属性
3.3 强制访问私有属性
上面的方法只能访问,但是不能修改,下面这种方法就更为暴力,可以访问也可以修改,就是:对象名._类名__属性名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name self .__sex = "man" #定义私有方法sex d = dog( "alex" ) print (d._dog__sex) #访问私有属性sex d._dog__sex = "woman" #修改私有属性sex print (d._dog__sex) #打印修改后的值 #输出 man woman |
四、总结
- 定义私有属性:self.__private_attr_name = private_attr_name
- 强制访问私有属性:对象名._类名__属性名(d._dog__sex)
- 对外提供只读接口访问:
def get_sex(self):
return self.__sex
面向对象【day07】:类的特性介绍(四)的更多相关文章
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。
微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- (转)面向对象——UML类图设计
背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...
- Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结果、结果分组、其他搜索特性介绍)
一.分面搜索 1. 什么是分面搜索? 分面搜索:在搜索结果的基础上进行按指定维度的统计,以展示搜索结果的另一面信息.类似于SQL语句的group by 分面搜索的示例: http://localhos ...
- 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)
不多说,直接上干货! 面向对象java的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
随机推荐
- 我的github地址 https://github.com/1010de/Test.git
构建之法老师叫交下任务学习github,经过一段时间的学习和了解,看介绍.看视频.看博客.初步认识到github的方便与好处. 自己试着去注册和使用github,已经慢慢学会了一些基本操作. ...
- java中定时执行任务
现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. 代码如下: package comz.autoup ...
- Integer Sequence Dividing CodeForces - 1102A (规律)
You are given an integer sequence 1,2,…,n1,2,…,n. You have to divide it into two sets AAand BB in su ...
- 去掉ambiguous expansion of macro警告
查看原文:http://www.heyuan110.com/?p=1221 用pod install后,pod工程里出现ambiguous expansion of macro的warning,对于有 ...
- [2017BUAA软件工程]第0次博客作业
[2017BUAA软件工程]第0次博客作业 结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 计算机是你喜欢的领域吗?是你擅长的领域吗? 我当时报考高考志愿的时候就已经是想好报 ...
- Java的常用命令javac与java
javac 可以使用javac -h来查看常用的命令: -> ~ # javac -help 用法: javac <options> <source files> 其中, ...
- HDU 2021 发工资咯:)
http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...
- 查看Linux机器名
uname -a hostname vim /etc/sysconfig/network
- JavaScript表单提交不能清空type为hidden的input快速解决方案
http://stackoverflow.com/questions/2559616/javascript-true-form-reset-for-hidden-fields 把input type= ...
- 梯度、散度、旋度、Jacobian、Hessian、Laplacian 的关系图
转自松鼠的窝 一.入门