#封裝的隱藏 #__開頭的屬性只是一種語法意義的變形,並不會真的限制外部的訪問 #這種變形只在類定義階段發送一次,類定義以後再新增的__開頭的屬性不會變形 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)