1、 应用场景及定义方式

①应用场景

  在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到

  私有属性 就是 对象 不希望公开的 属性

  私有方法 就是 对象 不希望公开的 方法

②定义方式

  在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法

  

class Women:

    def __init__(self, name):
self.name = name
# 不要问女人的年龄
self.__age = 18 def __secret(self):
print("我的年龄是%d" % self.__age) a = Women('Alice')
print(a) # # 私有属性,外部不能直接访问
# a.__age
# 私有方法, 外部不能直接访问
# a.__secret()

02. 伪私有属性和私有方法(科普)

提示:在日常开发中,不要使用这种方式访问对象的 私有属性 或 私有方法

Python 中,并没有 真正意义 的 私有

  在给 属性方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到

  处理方式:在 名称 前面加上 _类名 => _类名__名称

print(a._Women__age)   >> 18 # 私有属性外部不能直接访问
print(a._Women__secret()) >> 我的年龄是18 # 私有方法外部不能直接访问

03.get函数和set函数

解决外部访问私有属性问题

get函数和set函数为自定义函数,为了和封装概念吻合,命名为getXXX和setXXX

get函数:获取值

set函数:设置值【赋值,传值】

说明:本质都是一个普通成员函数,get函数一般有返回值,set设置参数

class Women:

    def __init__(self, name):
self.name = name
# 不要问女人的年龄
self.__age = 18 def setAge(self):
self.__age = 18 def getAge(self):
return self.__age def __secret(self):
print("我的年龄是%d" % self.__age) a = Women('Alice')
print(a.getAge()) >> 18

04.@property装饰器

装饰器:给函数动态的添加功能,对于类的成员方法也可以使用装饰器

@property装饰器:将一个函数当做变量使用,简化get和set函数

使用:@property装饰器作用于一个函数,相当于get函数

​ 与此同时会生成一个新的装饰器@属性名.setter,相当于set函数用于赋值

注意:@property装饰器只能使用在类中的成员方法中,简化代码,同时保证对参数进行校验

class Person:
def __init__(self, name, age):
self.__name = name
self.__age = age # 注意:函数的命名方式,get函数,
# 函数的命名并不是固定的,只要是一个合法的标识符即可,
# 但是,一般情况下,使用变量名命名,方便区分
@property
def name(self):
return self.__name # 注意:函数命名方式:和@property作用的函数名保持一致,
# 装饰器的命名方式:@属性名.setter
# 相当于是set函数,设置参数,给私有化属性进行赋值
@name.setter
def name(self, name):
self.__name = name @property
def age(self):
return self.__age @age.setter
def age(self, age):
if age < 0:
age = 0
self.__age = age
p1 = Person("jack", 15)
print(p1.name) #>>jack
p1.name = 'tom'
print(p1.name) #>>tom

最新文章

  1. 关于Java语言和面向对象记录
  2. 离散信源的分类和数学模型&amp;&amp;离散无记忆信源的熵
  3. ubuntu 16 mysql安装包安装 (推荐在线安装)
  4. 【BZOJ-4631】踩气球 线段树 + STL
  5. 修改 页面中默认的select样式
  6. jquery插件之表格隔行变色并鼠标滑过高亮显示
  7. vmware workstation LINUX磁盘扩容
  8. GO語言視頻教程下載
  9. php 用封装类的方法操作数据库和批量删除
  10. 程序开发心理学阅读笔记——第II篇
  11. SpringMVC简单搭建与入门
  12. python语言
  13. 利用Console来调试JS程序、Console用法总结
  14. HTML5学习笔记简明版(10):过时的元素和属性
  15. List集合及新特性引用
  16. wpf timePicker 时间选择控件
  17. LNMP shell
  18. springboot集成elasticsearch
  19. Scrapy-redis 分布式
  20. LeetCode 206. Reverse Linked List倒置链表 C++

热门文章

  1. Huawei S系列交换机 Easydeploy 特性
  2. 【HttpServlet】HttpServlet类
  3. Leetcode——3. 无重复字符的最长子串
  4. 学习:API断点
  5. 2014-2015 ACM-ICPC, Asia Tokyo Regional Contest
  6. TypeScript 解构和展开
  7. [PHP] Laravel 5.5 图片上传功能
  8. windows下如何制作和应用数字签名证书 全流程
  9. 【转】SkipList跳表基本原理
  10. TensorFlow实现文本情感分析详解