python中封装_Python 类的封装

本文介绍了Python中的封装概念,通过实例展示了如何使用双下划线实现私有化属性和方法,以及如何利用@property装饰器实现对外部友好的私有属性访问。通过这种方式,可以更好地控制类的内部状态并保护数据。
摘要由CSDN通过智能技术生成

封装(Encapsulation)是对 object 的一种抽象,即将某些部分隐藏起来,在程序外部看不到,即无法调用(不是人用眼睛看不到那个代码,除非用某种加密或者混淆方法,造成现实上的困难,但这不是封装)。

要了解封装,离不开“私有化”,就是将类或者函数中的某些属性限制在某个区域之内,外部无法调用。

Python 中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。例如:#!/usr/bin/env Python

# coding=utf-8

__metaclass__ = type

class ProtectMe:

def __init__(self):

self.me = "qiwsir"

self.__name = "kivi"

def __python(self):

print "I love Python."

def code(self):

print "Which language do you like?"

self.__python()

if __name__ == "__main__":

p = ProtectMe()

print p.me

print p.__name

运行一下,看看效果:$ python 21102.py

qiwsir

Traceback (most recent call last):

File "21102.py", line 21, in

print p.__name

AttributeError: 'ProtectMe' object has no attribute '__name'

查看报错信息,告诉我们没有__name 那个属性。果然隐藏了,在类的外面无法调用。再试试那个函数,可否?if __name__ == "__main__":

p = ProtectMe()

p.code()

p.__python()

修改这部分即可。其中 p.code() 的意图是要打印出两句话:"Which language do you like?"和"I love Python.",code() 方法和__python() 方法在同一个类中,可以调用之。后面的那个 p.__Python() 试图调用那个私有方法。看看效果:$ python 21102.py

Which language do you like?

I love Python.

Traceback (most recent call last):

File "21102.py", line 23, in

p.__python()

AttributeError: 'ProtectMe' object has no attribute '__python'

如愿以偿。该调用的调用了,该隐藏的隐藏了。

用上面的方法,的确做到了封装。但是,我如果要调用那些私有属性,怎么办?

可以使用 property 函数。#!/usr/bin/env Python

# coding=utf-8

__metaclass__ = type

class ProtectMe:

def __init__(self):

self.me = "qiwsir"

self.__name = "kivi"

@property

def name(self):

return self.__name

if __name__ == "__main__":

p = ProtectMe()

print p.name

运行结果:$ python 21102.py

kivi

从上面可以看出,用了 @property 之后,在调用那个方法的时候,用的是 p.name 的形式,就好像在调用一个属性一样,跟前面 p.me 的格式相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值