solidity學習(六)-- 例項證明require
面向物件
1.封裝
封裝是面向物件三大特性最核心的一個特性,封裝的意思其實就是整合
三大特徵:封裝,繼承,多型
2.將封裝的屬性進行隱藏操作
如何隱藏:在屬性名前加__字首,就會實現一個對外隱藏屬性效果,如下
該隱藏需要注意的問題:1.在類外部無法直接訪問雙下劃線開頭的屬性,但知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如Foo._Foo__A,所以說這種操作並沒有嚴格意義上的限制外部訪問,僅僅只是一種語法意義上的'變形'。
class Foo:
__x = 1
def __f1():
pass
這樣隱藏的話我們不能直接用Foo.x訪問,但是可以通過Foo._Foo__x可以訪問到
2.這種隱藏'對外隱藏','不對內隱藏'因為__開頭的屬性會在檢查類體內程式碼語法的時統一發生變形
對外不對內:在外部訪問不到__開頭的屬性,但是在類內部可以訪問到。
變形:本來是__x結果在__dict__裡面發現變成了_Foo__x。
class Foo:
__x = 1
def __f2():
print('hello')
def f1():
print(self.__x)
print(self.__f2)
obj = Foo()
obj.f1 # 得到的是1和hello ,這說明了在類內部是可以訪問到的
Foo.__x # 報錯,這說明在類外部是訪問不到的,除非用上面的那種方法
3.這種變形操作只在檢查語法的時候發生一次,之後定義的__開頭的都不會發生變形
為何要隱藏:資料屬性和函式屬性隱藏的意義
1.隱藏資料屬性
class People:
def __init__(self,name):
self.__name = name
def f1():
# 通過該介面就可以間接地訪問到名字屬性
print(self.__name)
obj = People('egon')
obj.f1() # 得到的是egon
將資料屬性隱藏起來就限制了類外部對資料的直接操作,然後類內應該提供相應的介面來允許類外部間接地操作資料,介面之上可以附加額外的邏輯來對資料的操作進行嚴格地控制
2.隱藏函式屬性
目的的是為了隔離複雜度,例如ATM程式的取款功能,該功能有很多其他功能組成,比如插卡、身份認證、輸入金額、列印小票、取錢等,而對使用者來說,只需要開發取款這個功能介面即可,其餘功能我們都可以隱藏起來
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()
obj=ATM()
obj.withdraw()
總結隱藏屬性與開放介面,本質就是為了明確地區分內外,類內部可以修改封裝內的東西而不影響外部呼叫者的程式碼;而類外部只需拿到一個介面,只要介面名、引數不變,則無論設計者如何改變內部實現程式碼,使用者均無需改變程式碼。這就提供一個良好的合作基礎,只要介面這個基礎約定不變,則程式碼的修改不足為慮。