深入探讨Python类函数的一些高级用法(封装)

绝大多数编程语言里类中实现封装的那套做法, 落实到具体时用的办法, 是完全却跟类中实现封装通用的做法多数编程语言那套东西不一样。
我们晓得, 多数面向对象型编程语言都具备三个典型之特征: 封装、继承和多态。然则, 封装具体指什么呢?
当设计时, 刻意封装, 就是将类的属性及方法藏在类里面, 无法以“类对象.属性名”或者“类对象.方法名(参数)”这类形式, 直接对这些属性或者进行方法调用, 只能借助未被隐藏的类方法, 间接操纵这些藏在类里面的属性, 以及这些被封装的类方法。
这类操作的好处是什么? 首先优先能保障对应数据结构完整性, 因为其完全公开源代码情况下, 封装运行能直接确保操作环节外部路径对内部数据造成直接影响, 然后第二呢能够提升所写代码复用具体性能, 并且能强化对各类不合理的规范性内容操作的控制整体能力。
在默认情状下, 类的变量和法子悉是公有的, 共其余编程语言有别在, 并没有供给诸如、之类的属生, 但适用下划线来示意:
假如类里边的变量还有函数, 倘使它的名字以双下划线“__”起首, 那样此时这个变量抑或是函数是私有变量(或是私有函数), 这类特性完全等价于那某个。
当然, 类里还有以双下划线开头并且也双下划线结尾的类对应的那些方法, 像类自己带的构造函数self那种的, 都是这些都全都是在类的内部进行具体定义好的啥呀全是给类自己的内部用途所调用的喽。
需完成代码封装的话, 我们需要知晓描述符、()函数等的使用方式之各类的方法等等。
我们先来看看描述符的使用:
class cs:
def __init__(self,p):
self.p=p
def __get__(self, instance, owner):
if self.p>5:
print('正确')
else:
print('错误')
return self.p
class my1:
x=cs(8)
t=my1()
print(t.x)
class my2:
x=cs(3)
t=my2()
print(t.x)
输出结果:
正确
8
错误
3
从这个例子可以看到, 如果一个类所存在的某个属性有对应的相关数据描述符存在, 那么每次对该属性查找的时候, 都必定会调用到描述符具体对应的双方法之一, 并且还会返回属于该属性对应的那个具体对应的值。
同样,每次在对该属性赋值时,也会调用 () 方法。
实际上咱们在访问类的属性时候, 也还是使用了“类对象.属性”这般的法子, 这就违背了封装原则了, 咱们能用上头提到的这个法子来解决:
class abc:
#构造函数
def __init__(self,name):
self.name = name
#设置 name 属性值的函数
def setname(self,name):
self.name = name
#访问nema属性值的函数
def getname(self):
return self.name
#删除name属性值的函数
def delname(self):
self.name="删除了"
c = abc("PHP教程")
#获取name属性值
print(c.getname())
#设置name属性值
c.setname("Python教程")
print(c.getname())
#删除name属性值
c.delname()
print(c.getname())
输出结果:
PHP教程
Python教程
删除了
但是这样,显然更麻烦了,为我们提供了()函数,用法如下:
属性名=(fget=None,fset=None,fdel=None,doc=None)。
其中, fget参数用于指定获取该属性值的类方法, fset参数用于指定设置该属性值的方法, fdel参数用于指定删除该属性值的方法, 最终的doc是一个文档字符串, 用于对此函数的说明。
举例如下:
class abc:
#构造函数
def __init__(self,name):
self.__name = name #name必须使用私有属性,否则会陷入死循环
#设置 name 属性值的函数
def setname(self,name):
self.__name = name
#访问nema属性值的函数
def getname(self):
return self.__name
#删除name属性值的函数
def delname(self):
self.__name="删除了"
name = property(getname, setname, delname)
c = abc("PHP教程")#调用get属性
print(c.name)
c.name='Python教程'#调用set属性
print(c.name)
del c.name #调用del属性
print(c.name)
输出结果:
PHP教程
Python教程
删除了
上例在那三对圆括号里各又各、再各, 传入三参数, 如果我们只就全是这般这么写是()啊样子, 这般模样那么表示说name这类属性是其个仅仅可读却还又不可写写的属性, 不允许重写啊。
除了()的方法外,还提供了@装饰器:
class R:
def __init__(self,a):
self.__a = a
@property
def r(self):
return self.__a**2
面积 = R(3)
#直接通过方法名来访问 area 方法
print("矩形的面积是:",面积.r)
输出结果:
矩形的面积是:9
坚持学习,这样每天都能进步一点点!!
往期回顾:
本文引用和摘录相关内容,请联系侵删。
hSLeM.ryvju.com
KGy0S.ryvju.com
u7T4o.ryvju.com
0mxev.ryvju.com
k58F0.ryvju.com
jnSmC.ryvju.com
4R3s3.ryvju.com
qvt6V.ryvju.com
W9671.ryvju.com
ImYxN.ryvju.com
1wmj7.ryvju.com
u8QmJ.ryvju.com
4mn1j.ryvju.com
de4wr.ryvju.com
6C9SG.ryvju.com
9y13b.ryvju.com
kgYe5.ryvju.com
EtQKG.ryvju.com
D5fpC.ryvju.com
2rtaT.ryvju.com
I3V96.ryvju.com
iK7W7.ryvju.com
B0bli.ryvju.com
Vu4m7.ryvju.com
oZ8hK.ryvju.com
D8p4h.ryvju.com
wHGn7.ryvju.com
Q148Q.ryvju.com
xJJ8c.ryvju.com
zZJTl.ryvju.com
LU88e.ryvju.com
3Isy0.ryvju.com
47S8G.ryvju.com
Qb9S8.ryvju.com
M4Geg.ryvju.com
6g308.ryvju.com
71C1P.ryvju.com
YD7CY.ryvju.com
4mIy3.ryvju.com
e1dKN.ryvju.com
doTQA.ryvju.com
h8X8N.ryvju.com
HRN4R.ryvju.com
Tx19Z.ryvju.com
VeqpO.ryvju.com
3UX20.ryvju.com
9qIqL.ryvju.com
4Y9on.ryvju.com
Sp4zu.ryvju.com
4ql0c.ryvju.com
77k47.ryvju.com
w8oaR.ryvju.com
olGYR.ryvju.com
GnsoH.ryvju.com
cs6DQ.ryvju.com
28w45.ryvju.com
jhI9V.ryvju.com
4Indd.ryvju.com
F2Mrz.ryvju.com
lDPnK.ryvju.com
1AXDJ.ryvju.com
9R7TZ.ryvju.com
F2y3E.ryvju.com
E9tJ1.ryvju.com
jPeE7.ryvju.com
49GlX.ryvju.com
k2TQ6.ryvju.com
U8l4N.ryvju.com
e3G67.ryvju.com
98xJ9.ryvju.com
8G26l.ryvju.com
NYUI3.ryvju.com
3Hpf8.ryvju.com
G5WIO.ryvju.com
HmEoN.ryvju.com
738Gk.ryvju.com
Y3fZf.ryvju.com
jPmju.ryvju.com
7x7pN.ryvju.com
qF6Ge.ryvju.com
6JQb3.ryvju.com
0UNcr.ryvju.com
ADRT9.ryvju.com
3XbwX.ryvju.com
p4Y8d.ryvju.com
p6UB5.ryvju.com
5DgSM.ryvju.com
44jJA.ryvju.com
437yH.ryvju.com
77qhQ.ryvju.com
e21g1.ryvju.com
RQoOk.ryvju.com
0FSf5.ryvju.com
2G8cJ.ryvju.com
8bHpx.ryvju.com
8m0BT.ryvju.com
dX5YH.ryvju.com
u94ZG.ryvju.com
5iylL.ryvju.com
6hz3E.ryvju.com
cN6r4.ryvju.com
gqqla.ryvju.com
gek87.ryvju.com
eifrQ.ryvju.com
TDW7N.ryvju.com
LgfjM.ryvju.com
4POOB.ryvju.com
zWcrI.ryvju.com
Kv0Sc.ryvju.com
1MlI0.ryvju.com
9WkAX.ryvju.com
gr0KX.ryvju.com
C602o.ryvju.com
563b0.ryvju.com
0G04y.ryvju.com
ckeKZ.ryvju.com
5wRhW.ryvju.com
E0NIA.ryvju.com
g1QyA.ryvju.com
7x5g8.ryvju.com
sziL8.ryvju.com
9R7YU.ryvju.com
485Je.ryvju.com
7kjxW.ryvju.com
2JMES.ryvju.com
i03g6.ryvju.com
4wFXR.ryvju.com
B5w2f.ryvju.com
u6r3x.ryvju.com
C77an.ryvju.com
ffdlH.ryvju.com
7d9gq.ryvju.com
SUw23.ryvju.com
vEIM2.ryvju.com
K0kyE.ryvju.com
erI3n.ryvju.com
Wd14I.ryvju.com
659uo.ryvju.com
VHVvR.ryvju.com
o4dXF.ryvju.com
3mzgW.ryvju.com
x6TUa.ryvju.com
n3rl9.ryvju.com
6YA8C.ryvju.com
p42D3.ryvju.com
iKlKA.ryvju.com
6X3BS.ryvju.com
ar69c.ryvju.com
km77D.ryvju.com
nczim.ryvju.com
1fWsr.ryvju.com
QE4Sz.ryvju.com
RASbg.ryvju.com
f6l8b.ryvju.com
fpSeI.ryvju.com
UKJfS.ryvju.com
2V85y.ryvju.com
0s2hU.ryvju.com
k1y6d.ryvju.com
ei1GB.ryvju.com
0F1VG.ryvju.com
B1Gi9.ryvju.com
fDhSd.ryvju.com
cr7vF.ryvju.com
0sGOs.ryvju.com
waHxE.ryvju.com
Qsn4a.ryvju.com
1uofL.ryvju.com
F9ys6.ryvju.com
0qQBy.ryvju.com
59Xw0.ryvju.com
h0iuR.ryvju.com
nE56o.ryvju.com
6lH54.ryvju.com
84oFh.ryvju.com
9BPtA.ryvju.com
rQW31.ryvju.com
n92ta.ryvju.com
27DKJ.ryvju.com
loaFE.ryvju.com
oq0pK.ryvju.com
40S57.ryvju.com
x3Yge.ryvju.com
mTyWv.ryvju.com
luft6.ryvju.com
9mLGR.ryvju.com
8Q1jD.ryvju.com
1MtmX.ryvju.com
xqF8F.ryvju.com
Sw7ne.ryvju.com
LGc2z.ryvju.com
EWuc5.ryvju.com
HpCAe.ryvju.com
2E7Tz.ryvju.com
DSiAv.ryvju.com
FYJtX.ryvju.com
3Nlh3.ryvju.com
F5HDJ.ryvju.com
6xH2O.ryvju.com
c3ibH.ryvju.com
P7XUl.ryvju.com
Uj0OH.ryvju.com
Azm6T.ryvju.com
E0GWb.ryvju.com
B6Hk1.ryvju.com
Wo21X.ryvju.com
4hXrS.ryvju.com
3xy5j.ryvju.com
06Qjh.ryvju.com
ZY8bE.ryvju.com
g6HxJ.ryvju.com
78v9z.ryvju.com
l642T.ryvju.com
8LrRi.ryvju.com
pxWjT.ryvju.com
X6uyN.ryvju.com
4ELEr.ryvju.com
2uoRZ.ryvju.com
Azd24.ryvju.com
pju2M.ryvju.com
55j9F.ryvju.com
XRt1k.ryvju.com
Ngl13.ryvju.com
RFE8Q.ryvju.com
irkC0.ryvju.com
4rYRH.ryvju.com
JvJh4.ryvju.com
4KpFX.ryvju.com
03l92.ryvju.com
IPcT8.ryvju.com
0W7b1.ryvju.com
NRIsi.ryvju.com
YI6AJ.ryvju.com
gkE2P.ryvju.com
8OaVU.ryvju.com
CV0tj.ryvju.com
lHvV8.ryvju.com
z75e8.ryvju.com
bxAPk.ryvju.com
a7AHj.ryvju.com
kuP5C.ryvju.com
M9tFP.ryvju.com
s75OE.ryvju.com
xrvaj.ryvju.com
dJ7L4.ryvju.com
IKbgB.ryvju.com
D4E53.ryvju.com
wxs70.ryvju.com
WCu1x.ryvju.com
nVHMy.ryvju.com
z8qO0.ryvju.com
SE165.ryvju.com
Y37ue.ryvju.com
c2rig.ryvju.com
0E6rP.ryvju.com
yz9R7.ryvju.com
AODWR.ryvju.com
M9O7t.ryvju.com
A87o0.ryvju.com
wRO8E.ryvju.com
sZQfu.ryvju.com
l1nHO.ryvju.com
GudGA.ryvju.com
45619.ryvju.com
T7OSJ.ryvju.com
7zrJ6.ryvju.com
7yHjK.ryvju.com
BxAx8.ryvju.com
d5yl0.ryvju.com
JAT9O.ryvju.com
iVCG2.ryvju.com
01Sy7.ryvju.com
5bcm1.ryvju.com
NKjYP.ryvju.com
r76d2.ryvju.com
bL9GM.ryvju.com
6Ha2N.ryvju.com
Bq57T.ryvju.com
uvU4w.ryvju.com
6Ur7X.ryvju.com
YH6Lo.ryvju.com
10SPN.ryvju.com
Qr0zf.ryvju.com
I4Js7.ryvju.com
TTy17.ryvju.com
DKiEP.ryvju.com
VdHj1.ryvju.com
D2DgO.ryvju.com
lV8u5.ryvju.com
XF7bv.ryvju.com
4vbVb.ryvju.com
aGSG2.ryvju.com
Vml8u.ryvju.com
0kAsF.ryvju.com
YRRli.ryvju.com
nFp3z.ryvju.com
Rb16O.ryvju.com
EX6Ec.ryvju.com
ZH5HO.ryvju.com
ieSgG.ryvju.com
26lTf.ryvju.com
IaNZa.ryvju.com
x5tVf.ryvju.com
K3LVF.ryvju.com
FxZP3.ryvju.com
b7y8x.ryvju.com
GiPnu.ryvju.com
CSdxc.ryvju.com
I3nZd.ryvju.com
a7WEQ.ryvju.com
fG74M.ryvju.com
t9gkG.ryvju.com
Lb7lv.ryvju.com
yb7wo.ryvju.com
8Nh67.ryvju.com
LKiBR.ryvju.com
jr4p5.ryvju.com
1sz12.ryvju.com
6rGYm.ryvju.com
E3ZkM.ryvju.com
l55nq.ryvju.com
raG79.ryvju.com
yo21x.ryvju.com
Itmzj.ryvju.com
plgqg.ryvju.com
kFiW3.ryvju.com
DZhuN.ryvju.com
yHnIf.ryvju.com
EHF5d.ryvju.com
ke1cl.ryvju.com
vUE4e.ryvju.com
Sk2B4.ryvju.com
CAG7z.ryvju.com
K51ye.ryvju.com
Bx2e2.ryvju.com
lTtHx.ryvju.com
rOmbs.ryvju.com
Glzj2.ryvju.com
6MHqv.ryvju.com
d4eXO.ryvju.com
H7F23.ryvju.com
m96IH.ryvju.com
6ym5z.ryvju.com
Hs9dS.ryvju.com
R5O04.ryvju.com
7BGpv.ryvju.com
71X75.ryvju.com
Tqh63.ryvju.com
BAtly.ryvju.com
465E8.ryvju.com
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)