面向对象【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 sayhithe 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)#输出2219 |
注:就是说在类的方法中或者类的外面都可以修改类的属性
三、定义私有属性
说明:之前我们说,我们可以访问类的属性,也可以随意修改类的属性,但是类属性一旦被定义成私有的,对外是不可以被访问的,也是不可以随意被改变的。
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_aged = 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()方法获取私有属性sexprint(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" #定义私有方法sexd = dog("alex")print(d._dog__sex) #访问私有属性sexd._dog__sex = "woman" #修改私有属性sexprint(d._dog__sex) #打印修改后的值#输出manwoman |
四、总结
- 定义私有属性: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的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
随机推荐
- squid反向代理
反向代理的作用是就爱那个网站中的静态自原本地化.也就是将一部分本应该有原是服务器处理的请求交给 Squid 缓存服务处理 编辑 Squid 服务程序的配置文件*(正向代理与反向代理不能同时使用,) ...
- Spring IOP 面向切面编程
Spring IOP 面向切面编程 AOP操作术语 Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.(类里面 ...
- HTML的input类型为hidden导致无法reset改字段的value问题
问题关键:根据HTML规范,hidden是非ui类元素,不接受用户处理.所以form的 reset并不影响它. http://stackoverflow.com/questions/6367793/w ...
- Redis应用一例(存证数量用计数器实现)
public Long getCreationCounter() { String host =PropertyUtils.getPropertyValue("redis.server.ho ...
- 关于EXCEL if、countif 在查找数据的用法
最近被其他部门的同事教导使用excel.突然觉得以前用代码切来切去的东西,和频繁比对的数据原来是用excel就能那么方便的算出,瞬间感觉打开了新世界的大门. 先说if和countif结合使用,来判断一 ...
- Jenkins之常用变量
BUILD_NUMBER 目前的编号,如“153” JOB_NAME 此构建项目的名称,如“foo”或“foo / bar”. JOB_BASE_NAME 此建立项目的名称将剥离文件夹路径,例如“ba ...
- multi_index_container 多索引容器
multi_index_container是c++ boost库中的一个多索引的容器.因工作中用到了,特来测试试用. #include "stdafx.h" #include &q ...
- BZOJ1828[USACO 2010 Mar Gold 2.Barn Allocation]——贪心+线段树
题目描述 输入 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i 输出 * 第一行: ...
- 博主自传——蒟蒻的OI之路
博主来自河北石家庄市第二中学,现在读高二,主攻信息学竞赛(其实并没有学习其他学科竞赛). NOIP中人品大爆发,使劲挤进河北省一等奖队伍,侥幸留在竞赛团队中(差点就淘汰出局啦). 关于我的ID,YOU ...
- tesseract-ocr 识别中文扫描图片
原文链接:http://www.cnblogs.com/alex-blog/articles/2714984.html 项目主页地址:http://code.google.com/p/tesser ...