封装约定
约定一:任何以单下划线开头的名字都应该是内部的,私有的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,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.__dict__) #__star存到类的属性字典中被重命名为_People__star
p1=People('333333','alex',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()