標籤:

【編程開發】Python隱藏屬性

【編程開發】Python隱藏屬性

來自專欄 測試開發員

小編在最初使用上Python之後,就一發不可收拾,人生苦短、我用Python,不光是因為其優雅簡潔,更是因為它強大的擴展性,特別是一些Python內置的私有屬性,熟練地掌握之後使得在開發過程中更靈活、更高效,今天小編就細數一些常用的私有屬性,希望能夠幫助到新手朋友們。

Python的隱藏屬性無處不在,內置的私有屬性往往是雙下劃線開頭,雙下劃線結尾,這裡我們從模塊到對象,由上往下的來列舉常用的屬性用法。

模塊屬性

1、__name__

當python文件被直接運行時,__name__的值為__main__,而當python文件以模塊的形式被導入時,__name__的值為模塊名

def say_hello(): print helloif __name__ == __main__: say_hello()

上面的代碼是最為常見的__name__的使用方式,當文件中有上述代碼後,直接運行腳本則會執行say_hello方法,通過import形式導入腳本文件時則不會執行say_hello。

2、__file__

在python模塊中使用__file__來獲取腳本所在的路徑,但得到的是相對路徑,若希望得到絕對路徑可使用os.path.realpath(__file__)

3、__all__

__all__指定的是當包被import * 的時候, 哪些模塊會被import進來

#test1.pyimport os, sys__all__ = [os]#test2.pyfrom test1 import *sys.pathImportError: No module named sys

上述代碼可以看出,本來導入test1模塊時,os、sys也會被一併導入進來,但是__all__屬性限定了只導入os,所以sys並沒有被導入進來。

4、__path__

__path__指定了包的搜索路徑,默認情況下只有一個元素, 就是當前包的路徑, 修改__path__, 可以修改此包內的搜索路徑,修改該屬性類似於修改sys.path

類、實例屬性

1、__class__

__class__屬於實例的屬性,直接指向該實例的類對象

class A(object): passa = A()a.__class__等同於A

2、__dict__

對象的屬性字典,key為屬性名,value為該屬性的值

註:__dict__若被實例對象引用則列出實例對象的屬性,若被類引用則列出類屬性

class A(): def __init__(self): self.x=1 #定義一個實例屬性 y = 2 #定義一個類屬性 a = A()a.__dict__{x: 1}A.__dict__{__doc__: None, __init__: function __main__.__init__ __module__: __main__, y: 2}

上述代碼可以看出,實例對象a的__dict__屬性只包含實例屬性x,而類A的__dict__屬性則包含了所有類屬性

3、__slots__

__slots__限制了類中只能定義某些屬性

class Test(object): __slots__ = [a]test = Test()test.a = 1test.b = 1AttributeError: Test object has no attribute b

__slots__限定了屬性集只能包含a,所以在定義屬性b時報出錯誤。

4、__new__、__init__

繼承自object的新式類才有__new__

__new__在實例被創建時調用,__init__在實例創建後的初始化時調用,所以先調用__new__,然後調用__init__

class A(object): def __init__(self): print init def __new__(cls,*args, **kwargs): print new %s%cls return object.__new__(cls, *args, **kwargs) A()# 輸出new class __main__.Ainit

__new__方法必須返回一個實例對象

5、__del__

相當於類的析構函數,當類對象被銷毀前調用

class MyClass(object): def __del__(self): print hehea = MyClass()del ahehe

6、操作符類屬性

__str__:str()或print時調用

__len__:len()時調用

__cmp__:cmp()時調用

__lt__,__gt__,__eq__:,,=時被調用

__add__,__sub__,__mul__,__div__:+、-、*、/時被調用

__getitem__,__setitem__,__delitem__:列表引用、設置、刪除時被調用

這些操作符類屬性是Python類的內置類方法,往往當需要重載操作符時重載相應的類方法即可。

7、自定義私有屬性

在定義類屬性時,若在該屬性前加上__,則該屬性被定義為私有屬性,即該屬性不可被外部直接引用,只能在類的內部使用

class A(object): def __init__(self): self.__a = 1 def func(self): print self.__aa = A()a.func()#輸出1a.__a#輸出AttributeError: A object has no attribute __a

然而Python對__a這個屬性做了什麼呢?實際上該屬性並不是不存在的,當在某個屬性前加上兩個下劃線後,python自動將其所在的類名追加在屬性前導致其擁有了新的屬性名,也由此實現了該屬性不可引用的假象

class A(object): def __init__(self): self.__a = 1 def func(self): print self.__aa = A()a._A__a#輸出1

好了,我們就討論到這裡,關於Python更多的編程技巧、知識我們後續會繼續交流,也歡迎感興趣的朋友們私信討論。


推薦閱讀:

Python黑帽編程 3.5 DTP攻擊
【Python3網路爬蟲開發實戰】 1.1-Python3的安裝
黃哥在值乎提供Python答疑服務
可能是史上最邪惡的 __init__.py
上手Bokeh | 互動式數據可視化庫Bokeh的快速入門

TAG:Python | 編程 |