面向对象【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的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
随机推荐
- Sprint 冲刺第三阶段第6-10天
这几天一直都在整理我们之前的内容,检查会不会有细节问题.例如界面跳转.颜色等. 因为一直没办法找到guitub存放位置.于是在这里存放一些主代码. MainActivity.java package ...
- Docker(二十)-Docker容器CPU、memory资源限制
背景 在使用 docker 运行容器时,默认的情况下,docker没有对容器进行硬件资源的限制,当一台主机上运行几百个容器,这些容器虽然互相隔离,但是底层却使用着相同的 CPU.内存和磁盘资源.如果不 ...
- [转帖]Windows7 结束更新 以及后期更新花费。
你不应该为Windows 7更新付费的三个原因 https://www.linuxidc.com/Linux/2019-02/156777.htm 对Windows 7的支持将在2020年1月结束,这 ...
- [转帖]简析数据中心三大Overlay技术
简析数据中心三大Overlay技术 http://www.jifang360.com/news/20161010/n225987768.html 搭建大规模的云计算环境需要数据中心突破多种技术难题,其 ...
- C++与C的区别
在最开始C++只是C加上了一些面向对象的特性,C++最初的名字为C with Classes.后来C++又提出了一些不同于Class的特性:Exceptions(异常).templates(模板).S ...
- hive数据查询
Fetch task 丢弃了mapreduce的作业的繁重任务,查询方便简单 1.第一种方式 2.linux命令行 3.地3中
- Baltic Dry Index
波罗的海干散货指数(Baltic Dry Index,缩写BDI),是航运业的经济指标,它包含了航运业的干散货交易量的转变. BDI波罗的海指数是由几条主要航线的即期运费(Spot Rate)加权计算 ...
- AtCoder WTF 2019 C2. Triangular Lamps Hard
题目链接 感觉这样的题真的称得上是鬼斧神工啊,\(\text{OI}\)中能多一些这样的题目就太好了. 题意: 有一个二维的三角坐标系,大概如图所示(图是从atcoder里偷下来的): 坐标系上的每个 ...
- java List 根据属性排序
Collections.sort(fileItems, new Comparator<FileItem>() { public int compare(FileItem arg0, Fil ...
- Windows 增加远程连接数
转载自 https://blog.csdn.net/scholar_man/article/details/60570827 1.设置终端设置,需要打开[控制面板]---[系统和安全] 2.进入系统和 ...