1. 程式人生 > >Python類的方法或特性變為“私有”方式

Python類的方法或特性變為“私有”方式

   Python並不直接支援私有方式,而是靠程式設計師自己把握在外部進行特性修改的時機。畢竟在使用物件前應該知道如何使用。但是,可以使用一些小技巧達到私有特性的效果。

"單下劃線" 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數

"雙下劃線" 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到這個資料

   為了讓方法或者特性變為私有(即使從外部無法訪問),只要在他的名字前面加上雙下劃線即可:

__metaclass__ = type #確定使新式類
class Person:
    __name = "xiaoli"

    def __ingreet(self):
        print("Hello,World!I'm %s."%self.__name)

    def outgreet(self):
        self.__ingreet()
   現在特性__name與方法__ingreet()從外界是無法進行訪問的,而在類內部是可以訪問的:
>>>foo = Person()
>>>foo.__ingreet()
    AttributeError: 'Person' object has no attribute '__ingreet'
>>>foo.__name
    AttributeError: 'Person' object has no attribute '__name'
>>>foo.outgreet()
    Hello,World!I'm xiaoli.
   

   儘管雙下劃線有些奇怪,但是看起來像是其他語言中的標準私有方法。真正發生的事情才是不標準的。類的內部定義中,所有雙下劃線開始的的名字都被“翻譯”成前面加上單下劃線和類名的形式。

>>>Person._Person__ingreet()
    Person._Person__ingreet()
   在瞭解了這些幕後的事情後,實際上還是能在類外訪問這些私有方法,儘管不應該這樣做:
>>>foo = Person()
>>>foo._Person__ingreet()
    Hello,World!I'm xiaoli.
   

   簡而言之,確保其他人不會訪問物件的方法和特性是不存在的,但是類的“名稱變化術”就是他們不應該訪問這些函式或者特性的強有力的訊號。

   如果不需要使用這種方法但是又想讓其他物件不要訪問內部資料,那麼可以使用單下劃線。這不過是一個習慣,但的確有實際效果。例如,前面帶有下劃線的名在都不會被帶星號的import語句(form module import *)匯入(有些語言支援多種層次的成員變數私有性。比如Java就支援4種級別。儘管單雙下劃線在某種程度上給出了兩個級別的私有性,但是Python並沒有真正的私有化支援)。