本节内容

1、概述

2、访问属性

3、私有属性

4、总结

一、概述

 在上篇博客中我们已经讲了一些关于类的知识,我们来回顾以下:

  1. 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
  2. __init__()构造函数
  3. self.name = name 被称为属性、成员变量、字段
  4. 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))
 
= 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属性
 
= 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
 
= dog("alex",18)
print(d.__sex) #访问私有属性__sex
 
#输出
Traceback (most recent call last):
  File "E:/PycharmProjects/pythontest/day6/封装.py", line 16in <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值
 
= 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
 
= dog("alex")
print(d._dog__sex)  #访问私有属性sex
d._dog__sex = "woman"  #修改私有属性sex
print(d._dog__sex) #打印修改后的值
#输出
man
woman

四、总结

  1. 定义私有属性:self.__private_attr_name = private_attr_name
  2. 强制访问私有属性:对象名._类名__属性名(d._dog__sex)
  3. 对外提供只读接口访问:

    def get_sex(self):

      return self.__sex

面向对象【day07】:类的特性介绍(四)的更多相关文章

  1. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  2. 微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同。

    微软在 .NET 3.5 新增了一个 HashSet 类,在 .NET 4 新增了一个 SortedSet 类,本文介绍他们的特性,并比较他们的异同. .NET Collection 函数库的 Has ...

  3. 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...

  4. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  5. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  6. 【转】Python之面向对象与类

    [转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...

  7. (转)面向对象——UML类图设计

    背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...

  8. Solr系列六:solr搜索详解优化查询结果(分面搜索、搜索结果高亮、查询建议、折叠展开结果、结果分组、其他搜索特性介绍)

    一.分面搜索 1. 什么是分面搜索? 分面搜索:在搜索结果的基础上进行按指定维度的统计,以展示搜索结果的另一面信息.类似于SQL语句的group by 分面搜索的示例: http://localhos ...

  9. 牛客网Java刷题知识点之面向对象java的四大特性(抽象、封装、继承、多态)

    不多说,直接上干货! 面向对象java的四大特性之抽象 抽象就是有点模糊的意思,还没确定好的意思. 就比如,要定义一个方法和类.但还没确定怎么去实现它的具体一点的子方法,那我就可以用抽象类或接口.具体 ...

随机推荐

  1. hive数据查询

    Fetch task 丢弃了mapreduce的作业的繁重任务,查询方便简单 1.第一种方式 2.linux命令行 3.地3中

  2. spring cloud实战与思考(四) JWT之Token主动失效

    需求: JWT泄露.密码重置等场景下,需要将未过期但是已经不安全的JWT主动失效. 本文不再复述JWT的基础知识,不了解的小伙伴可以自行Google一下.这里主要是针对以上需求聊一聊解决方案.如果服务 ...

  3. LODOP打印控件关联输出各内容

    Lodop打印控件利用SET_PRINT_STYLEA里面的“LinkedItem”可以把多个独立的内容关联起来,让它们顺序打印.这样,就可以实现很多效果,例如一些内容紧跟着表格下方输出,关联表格后就 ...

  4. DOM 操作技术【JavaScript高级程序设计第三版】

    很多时候,DOM 操作都比较简明,因此用JavaScript 生成那些通常原本是用HTML 代码生成的内容并不麻烦.不过,也有一些时候,操作DOM 并不像表面上看起来那么简单.由于浏览器中充斥着隐藏的 ...

  5. Cenos7 添加service,开机启动

    本地有一个 data-service.jar 1. 编写启动脚本  data-service-start [root@iz2ze0fq2isg8vphkpos5sz shell]# more data ...

  6. Django-website 程序案例系列-18 多表跨表操作优化

    详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 在数据库有外键的时候,使用 select_related() 和 pref ...

  7. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP

    题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场 ...

  8. hdu1176 (免费馅饼)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. Educational Codeforces Round 3 C. Load Balancing

    C. Load Balancing time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  10. LOJ #2721. 「NOI2018」屠龙勇士(set + exgcd)

    题意 LOJ #2721. 「NOI2018」屠龙勇士 题解 首先假设每条龙都可以打死,每次拿到的剑攻击力为 \(ATK\) . 这个需要支持每次插入一个数,查找比一个 \(\le\) 数最大的数(或 ...