加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python3 面对对象编程三大特性之一:封装

发布时间:2020-12-17 16:59:29 所属栏目:Python 来源:网络整理
导读:封装约定 约定一:任何以单下划线开头的名字都应该是内部的,私有的 class?People:????_star='earth'????def?__init__(self,id,name,age,salary):????????self.id=id????????self.name=name????????self._age=age????????self._salary=salary????def?_get_id(s

封装约定

约定一:任何以单下划线开头的名字都应该是内部的,私有的

class?People:
????_star='earth'
????def?__init__(self,id,name,age,salary):
????????self.id=id
????????self.name=name
????????self._age=age
????????self._salary=salary

????def?_get_id(self):
????????print('我是私有方法啊,我找到的id是[%s]'?%self.id)
#我们明明约定好了的,只要属性前加一个单下划线,那他就属于内部的属性,不能被外部调用了啊,为何还能调用???
print(People._star)
p1=People('3706861900121221212','alex',28,10)

print(p1._age,p1._salary)
p1._get_id()

约定二:双下划线开头的名字

class?People:
????__star='earth'
????def?__init__(self,salary):
????????self.id=id
????????self.name=name
????????self.__age=age
????????self._salary=salary

????def?_get_id(self):
????????print('我是私有方法啊,我找到的id是[%s]'?%self.id)


print(People.__dict__)????#__star存到类的属性字典中被重命名为_People__star
p1=People('333333',18,10)

print(p1.__dict__)????????#__age存到类的属性字典中被重命名为_People__age


注意:python中封装的私有属性是可以访问的

class?People():
????_star?=?'地球'
????__population?=?'13亿'


p1?=?People()
print(p1._star)???????????????????#?地球
print(People.__dict__)????????????#?'_People__population':?'13亿'
print(p1._People__population)?????#?13亿人

这是因为双下滑线开头的属性在继承给子类时,子类是无法覆盖的(原理也是基于python自动做了双下滑线开头的名字的重命名工作)


封装的三个层面

????第一个层面的封装:类就是麻袋,这本身就是一种封装

????第二个层面的封装:类中定义私有的,只在类的内部使用,外部无法访问

????第三个层面的封装:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑提供一个访问接口给外部使用什么是反射


接口函数:

class?People():
????__star?=?'地球'

????def?get_star(self):
????????print(self.__star)

p1?=?People()
p1.get_star()


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读