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進來
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #test1.py import os, sys __all__ = [os]#test2.py from test1 import * sys.path ImportError: 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__若被實例對象引用則列出實例對象的屬性,若被類引用則列出類屬性
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' 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 = 1 test.b = 1 AttributeError: 'Test' object has no attribute 'b'__slots__限定了屬性集只能包含’a’,所以在定義屬性’b’時報出錯誤。
4、__ new__、__ init__
繼承自object的新式類才有__new__
__ new__在實例被創建時調用,__init__在實例創建后的初始化時調用,所以先調用__new __ ,然后調用__init __
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A(object): def __init__(self):print initdef __new__(cls,*args, **kwargs):print new %s%clsreturn object.__new__(cls, *args, **kwargs)A()# 輸出 new class '__main__.A' init__new__方法必須返回一個實例對象
5、__ del__
相當于類的析構函數,當類對象被銷毀前調用
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class MyClass(object):def __del__(self):print hehea = MyClass() del a hehe6、操作符類屬性
-
__ 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 = 1def func(self):print self.__aa = A() a.func() #輸出 1 a.__a #輸出 AttributeError: 'A' object has no attribute '__a'然而Python對__a這個屬性做了什么呢?實際上該屬性并不是不存在的,當在某個屬性前加上兩個下劃線后,python自動將其所在的類名追加在屬性前導致其擁有了新的屬性名,也由此實現了該屬性不可引用的假象
class A(object):def __init__(self):self.__a = 1def func(self):print self.__aa = A() a._A__a #輸出 1總結
以上是生活随笔為你收集整理的Python隐藏属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 文件读写模式r,r+,w,
- 下一篇: Python内置的heapq模块的使用