首页 > 其他分享 >42.封装

42.封装

时间:2023-11-17 14:45:38浏览次数:34  
标签:__ 封装 类外 self 42 print obj 属性

访问控制

在Python中并没有像Java,C++ 一样,提供了 publicprotectedprivate 这样的访问控制修饰符,Python 通过一种称为 名称改写的方式,实现其它语言中访问控制修饰符的作用。

但是要注意的是,在Python中名称改写只是一种约定,并没有真正的实现私有的作用,在 Python 中只要想访问,所有的数据都可以拿到,获取方法在这里不讨论。

无下划线前缀(公有权限)

Python 中默认定义的属性和方法,都是公有的方法。无论是在类外,还是在派生的子类中,都可以进行访问,类似其它语言中的 public 修饰符的作用。

class A(object):
def __init__(self):
# 公有属性
self.a = 10

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外使用公有方法
obj.show()

_ 单下划线前缀(保护权限)

Python 在类中使用 单下划线前缀 实现其它语言中 protected 保护权限的功能,在属性或方法(包括类属性和类方法,作用相同)前添加一个单下划线,该属性或方法,在当前类中可以访问,

在类外理论上不可访问(使用时不提示,但写出来程序可以运行,但有警告),在通过继承派生的子类中可以访问(继承在后面讲解)。

class A(object):
def __init__(self):
# 公有属性
self.a = 10
# 保护属性
self._b = 12

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')
# 在类中使用保护属性
print(f'B: {self._b}')
# 在类中使用保护权限的方法
self._display()

# 保护权限的方法
def _display(self):
print(f'B: {self._b}')


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外无法使用保护权限的属性(不建议这样使用)
print(obj._b)
# 在类外使用公有方法
obj.show()
# 在类外无法使用保护权限的方法(不建议这样使用)
obj._display()

_ _ 双下划线前缀(私有属性)

Python 在类中使用 双下划线前缀 实现其它语言中 private 私有权限的功能,在属性或方法(包括类属性和类方法,作用相同)前添加一个双下划线,该属性或方法,只能在当前类中可以访问,

在类外任何位置不可访问(只是理论上不可访问,通过某些方式,还是可以在类外访问,不建议这样使用)。

class A(object):
def __init__(self):
# 公有属性
self.a = 10
# 保护属性
self._b = 20
# 私有属性
self.__c = 30

# 公有方法
def show(self):
# 在类中使用公有属性
print(f'A: {self.a}')
# 在类中使用保护属性
print(f'B: {self._b}')
# 在类中使用私有属性
print(f'C: {self.__c}')
# 在类中使用保护权限的方法
self._display()
# 在类中使用私有方法
self.__info()

# 保护权限的方法
def _display(self):
print(f'B: {self._b}')

# 私有权限的方法
def __info(self):
# 在类中使用私有属性
print(self.__c)


obj = A()
# 在类外使用公有属性
print(obj.a)
# 在类外无法使用保护权限的属性(不建议这样使用)
print(obj._b)
# 在类外使用私有属性,访问失败
# print(obj.__c)
# 在类外使用公有方法
obj.show()
# 在类外无法使用保护权限的方法(不建议这样使用)
obj._display()
# 在类外访问私有方法,访问失败
# obj.__info()

双下划线前缀与后缀

在 Python 中还有一种同时具有前后双下划线的变量或方法,这些方法是 Python 中的魔法属性或魔法方法,这些属性或方法名被赋予了特殊的作用,比如:初始化方法 __init__(), 对象描述方法 __str__(), 还有 __iter__()__next__() 方法等,这些都是魔法方法。

标签:__,封装,类外,self,42,print,obj,属性
From: https://www.cnblogs.com/csfsz/p/17838615.html

相关文章

  • 学习笔记426—keras中to_categorical函数解析
    keras中to_categorical函数解析1.to_categorical的功能简单来说,to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式。先上代码看一下效果:fromkeras.utils.np_utilsimport*#类别向量定义b=[0,1,2,3,4,5,6,7,8]......
  • 学习笔记424—%matplotlib inline的作用
    %matplotlibinline的作用%matplotlibinline是一个魔术命令(magiccommand),用于在JupyterNotebook或IPython环境中显示matplotlib图形的内嵌设置。当使用%matplotlibinline命令时,它会告诉Python在生成的图形直接嵌入到Notebook中的输出单元格中,而不是作为弹出窗口显示。......
  • AO3400-ASEMI中低压MOS管AO3400参数、封装、尺寸
    编辑:llAO3400-ASEMI中低压MOS管AO3400参数、封装、尺寸型号:AO3400品牌:ASEMI封装:SOT-23连续漏极电流(Id):5.8A漏源电压(Vdss):30V功率(Pd):1.4W芯片个数:1引脚数量:3类型:MOS管特性:N沟道MOS管、中低压MOS管RDS(on):28mΩVGS:1.45封装尺寸:如图工作温度:-55°C~150°CAO3400......
  • P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement
    P9842[ICPC2021NanjingR]KleeinSolitaryConfinement你说得对,但是Klee比根号可爱捏题意简述给定\(n,k\)和一个长为\(n\)的序列,你可以选择对区间\([l,r]\)的数整体加上\(k\),也可以不加。最大化众数出现次数并输出。分析直接做肯定是不好做的,考虑转换思路,考虑区......
  • 【漏洞复现】JumpServer伪随机密码重置漏洞[CVE-2023-42820]
    Jumperver是飞致云公司(https://www.jumpserver.org)旗下开源的堡垒机,是国内最受欢迎的开源堡垒机之一。小编也经常使用,也介绍给一些运维的客户使用,简直是运维神器。2023年9月爆出CVE-2023-42820造成任意用户密码重置漏洞。大概就是Jumpserver的一个第三方库django-simp......
  • JS判断变量的具体数据类型封装函数
    封装函数为://返回传入值的数据类型functionGetValueType(val){vartype=typeofval//object需要使用Object.prototype.toString.call判断if(type==='object'){vartypeStr=Object.prototype.toString.call(val)//解析[objectStr......
  • 微信小程序TypeScript请求封装(TS+request)
    目录结构-WxApp-api请求方式-index.ts统一输出api接口-base.ts环境判断-user对应数据请求-userApi.ts-utils-request.ts封装请求封装request首先,我们先搞w......
  • php封装的curl请求方法
    get请求function curlGet($url, array $header = array(), $timeout = 5){    $ch = curl_init();//初始化    curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页    curl_setopt($ch, CURLOPT_HEADER, 0);//是否显示头信息,1显示,0不显示    ......
  • vue2组件二次封装
    有时候公共UI组件满足不了一些特定的需求样式,并且有较多地方使用同一个UI组件,这时候就需要考虑二次封装现有UI组件组件二次封装关键的几点:使用$attrs接收props使用$listeners 接收事件使用$slots和$scopedSlots接收插槽使用model定义prop变量及其变化的事件(改变v-mo......
  • P9242 [蓝桥杯 2023 E题] 接龙数列
    P9242[蓝桥杯2023E题]接龙数列一眼LIS但是TLE八个点。发现是sb了,应该用string来存数直接取首位末位。改完50分,TLE五个点。换状态\[F_i$$为以数字$i$结尾的最长接龙数列。则顺推每个数字,从每个数字的首位$F_{j_1}+1$以及末位$F_{j_n}$中取最大转移而来。即......