#封装的隐藏 #__开头的属性只是一种语法意义的变形,并不会真的限制外部的访问 #这种变形只在类定义阶段发送一次,类定义以后再新增的__开头的属性不会变形 class foo: __n=1 #__对外部隐藏属性。 def __init__(self,x,y): self.x=x self.__y=y #sele._foo__y=y def __f1(self): #_foo__f1 print('f1') def f2(self): print(self.__n,self.__y) #print(self._foo__n,self._foo__y) print(foo.__dict__) print(foo._foo__n) print(foo._foo__f1) #obj=foo(1,2) #print(obj._foo__y) #这种隐藏只对外不对内,由于内部定义的属性在类定义阶段统一发生变形。 foo.__n=2 print(foo.__dict__) print(foo.__n) oov=foo(1,2) oov.f2() #属性查找指定的函数 class foo: def __f1(self): print('f1') def f2(self): print('f2') self.__f1() #b.f1() class bar(foo): def f1(self): print('bar.f1') b=bar() b.f2 #封装的真正意义 class peple: def __init__(self,name,age): self.set_info(name,age) def tell__info(self): print('姓名:《%s》,年龄:《%s》' %(self.__name,self.__age)) def set_info(self,name,age): if type(name) is not str: raise TypeError('name must be str') if type(age) is not int: raise TypeError('age must be int') self.__name = name self.__age = age p=peple('abc',18) #print(p.__dict__) p.set_info('ad',23) p.tell__info() #property class peope: def __init__(self,name,age,height,weight): self.name=name self.age=age self.height=height self.weight=weight @property #装饰器,使用一个计算获得的数据属性的值 def bmi(self): return self.weight / (self.height ** 2) a=peope('abc',37,1.80,63) #print(a.bmi()) print(a.bmi) class peo: def __init__(self,name,age): self.__name=name self.age=age @property def name(self): return self.__name @name.setter def name(self,obj): self.__name=obj @name.deleter def name(self): del self.__name b=peo('abc',48) print(b.name) #修改 b.name='ooo' print(b.name) #删除 del b.name print(b.name)