面向对象【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的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...
随机推荐
- github学习步骤
组员1: 王文政 201303011159 作业网址 :https://github.com/1246251747/3/blob/master/jjj.txt 心得: 1. 申请gi ...
- Junit测试用例
一.题目简介 返回一个给定整数参数的绝对值. 二.源码的github链接 https://github.com/liyan941016/test/blob/master/FileTest.java h ...
- MyBatis 返回类型resultType为map时的null值不返回问题
问题一: 查询结果集中 某字段 的值为null,在map中不包含该字段的key-value对 解决:在mybatis.xml中添加setting参数 <!-- 在null时也调用 sett ...
- ubuntu安装网易云音乐
1直接安装sudo dpkg -i netease-cloud-music_1.0.0_i386_ubuntu16.04.deb 2修复并自动安装所有依赖包 sudo apt-get install ...
- canvas高斯模糊算法
对于模糊图片这个效果的实现,其实css3中的filter属性也能够实现,但是这个属性的兼容性不是很好,所以我们通常不用这种方法实现,而使用canvas配合JS实现. <span style=&q ...
- codeforces387B
George and Round CodeForces - 387B George decided to prepare a Codesecrof round, so he has prepared ...
- python中字典和json的区别
python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转 定义 python中,json和dict非常类似,都是k ...
- Java_常用工具类收集
一.日期工具类 package com.ebd.application.common.utils; import java.sql.Timestamp; import java.text.DateFo ...
- Uva10474-STL水题-白书
白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...
- 19+ JavaScript 常用的简写技巧
博主说:对于任何基于 JavaScript 的开发人员来说,这绝对是一篇必读的文章,乃提升开发效率之神器也. 正文 js 1. 三元运算符 当你想用一行代码来写if...else语句的时候,使用三元操 ...