面向物件 7 封裝之如何實現屬性的隱藏&封裝的意義&封裝可擴充套件性&property
阿新 • • 發佈:2018-12-14
封裝之如何實現屬性的隱藏
# class A: # __x=1 #'_A__x': 1 # # def __init__(self,name): # self.__name=name #self.__A__name=name # # def __foo(self): #def __A__foo(self) # print('run foo') # # def bar(self): # self.__foo() #self._A__foo() # print('from bar') # # # print(A.__dict__) # # print(A.__x) # # print(A.__foo) # # # a=A('egon') # # a._A__foo() # # a._A__x # # # print(a.__name) #a.__dict__['__name'] # # print(a.__dict__) # # a.bar() ''' 這種變形的特點: 1、外部無法直接obj.__AttrName 2、在內部可以直接使用:obj.__AttrName 3、子類無法覆蓋父類__開頭的屬性 ''' # class Foo: # def __func(self): #_Foo__func # print('from foo') # # class Bar: # def __func(self): #_Bar__func # print('from bar') # b=Bar() # b.func() ''' 總結 這種變形需要注意的問題: '''
class B: __x=1 def __init__(self,name): self.__name=name #self._B__name=name #驗證問題一: # print(B._B__x) #驗證問題二: # B.__y=2 # print(B.__dict__) # b=B('egon') # print(b.__dict__) # # b.__age=18 # print(b.__dict__) # print(b.__age) #驗證問題三: class A: def __foo(self): #_A__foo print('A.foo') def bar(self): print('A.foo') self.__foo() class B: def __foo(self): print('B.foo') b=B() b.bar()
封裝的意義
#一:封裝資料屬性:明確區分內外 # class People: # def __init__(self,name,age): # self.__name=name # self.__age=age # # def tell_info(self): # print('Name:<%s> Age<%s>'%(self.__name,self.__age)) # # def set_info(self,name,age): # if not isinstance(name,str): # print('名字必須是字串型別') # return # if not isinstance(age,int): # print('年齡必須是數字型別') # self.__name=name # self.__age=age # # p=People('egon',30) # # # p.tell_info() # # p.set_info('aa',13) # p.set_info(1111,'10') # p.set_info('aa','10') # # p.tell_info() #二、封裝方法:隔離複雜度 class ATM: def __card(self): print('插卡') def __auth(self): print('使用者認證') def __input(self): print('輸入取款金額') def __print_bill(self): print('列印賬單') def __take_money(self): print('取款') def withdraw(self): self.__card() self.__auth() self.__input() self.__print_bill() self.__take_money() a=ATM() a.withdraw()
封裝可擴充套件性
class Room:
def __init__(self,name,owner,weight,length,height):
self.name=name
self.owner=owner
self.__weight=weight
self.__length=length
self.__height=height
def tell_area(self):
return self.__weight*self.__length*self.__height
r=Room('衛生間','alex',10,10,10)
print(r.tell_area())
# r.tell_area()
property
'''
bmi 指數
成人bmi
'''
# class People:
# def __init__(self,name,weight,height):
# self.name=name
# self.weight=weight
# self.height=height
#
# @property
# def bmi(self):
# # print('-------->')
# return self.weight/(self.height**2)
#
# p=People('egon',75,1.81)
# # p.bmi=p.weight/(p.height**2)
# # print(p.bmi)
#
# print(p.bmi)
class People:
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.setter
def name(self,val):
# print('setter',val)
if not isinstance(val,str):
print('名字必須是字串型別')
return
self.__name=val
@name.deleter
def name(self):
# print('deleter')
print('不允許刪除')
p=People('egon')
# print(p.get_name())
# print(p.name)
# p.name='Egon'
# p.name=123
del p.name
print(p.name)