国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Python屬性、方法和類管理系列之----屬性初探

2019-11-14 17:03:10
字體:
來源:轉載
供稿:網友

在學習dict的時候,肯定聽過dict是Python中最重要的數據類型,但是不一定知道為什么。馬上你就會明白原因了。
Python中從模塊、到函數、到類、到元類,其實主要管理方法就是靠一個一個的字典。

函數dir

先來學一個重要的內置函數。
dir返回一個列表。
列表中包含了實例的屬性名,實例的類的屬性名,實例的所有超類的屬性名。
如果你想獲取一個對象所有有效屬性,你應該使用dir()來替代__dict__或者__slots__

我們先來寫一個沒有什么實際意義的module。
a.py

PRint('start')import sysfrom threading import Threadimport datetimedef f1():    x=a     #這里故意設置了一個沒有初始化的變量a    def inner():        y=1        return y    return innerclass A:    xx=1    def f2(self):        yy=2        return yya=A()print('end')

模塊的重要屬性

在Python運行的時候,會從上到下把變量放入一個叫__dict__字典中,并運行所有的打印語句。

>>> import astart       #打印語句會全部運行。end>>> a.__dict__.keys()       #會把全局變量放在這個字典中,同時Python會自動生成一些字典鍵值對。dict_keys(['__name__', '__package__', '__doc__', '__loader__', 'datetime', 'A', '__spec__', '__builtins__', '__cached__', '__file__', 'f1', 'sys', 'a', 'Thread'])

你肯定聽說過import和from語句是隱形的賦值語句,現在可以看到他們的名字出現在這個字典中了吧。
你也肯定聽說過def和class語句是隱形的賦值語句,找找看是不是也出現在這個字典中了?
當然還包括我們的賦值語句中定義的變量a了。

現在我們進一步探究一下這個有用的字典。

>>> a.__builtins__.keys()   #這個是builtins模塊中定義的所有變量,中間省略了很多。#Python判斷我們的一個變量是否定義過,就是看變量是否出現在a.__dict__或a.__builtins__中。dict_keys(['setattr', 'slice', 'ZeroDivisionError', 'IndexError', 'KeyError', 'TimeoutError', 'map', 'isinstance', 'bin', 'bytearray', 'zip', 'locals', 'IsADirectoryError', 'AttributeError', ...'False', 'print', 'vars', 'exit', 'EnvironmentError'])>>> a.__doc__       #這個是模塊的文檔字符串,由于我們沒有定義,所以為Null>>> a.__file__      #這個是運行的文件名。'/home/aaa/proj/a.py'>>> a.__name__      #這個是我們的文件名,不包括路徑和擴展名py'a'

額外說一句,如果我們直接運行一個Python文件,那么這個文件會出現在sys.modules中,事實上,我們所有import的對象都會出現在這個字典中。

>>> sys.modules[__name__]<module '__main__' (built-in)>      #這個就是我們運行的Python文件。>>> sys.modules['datetime']<module 'datetime' from '/usr/lib/python3.4/datetime.py'>   #這是我們導入的datetime文件。>>> sys.modules['logging']      #我們沒有import過logging模塊,所以找不到。Traceback (most recent call last):  File "<stdin>", line 1, in <module>KeyError: 'logging'

函數的重要屬性

我們在a.py中輸入一下測試內容。

g=55def f1(arg=2,arg2='c',*,kargs=3,kargs2='dd'):    x=a     #這里故意設置了一個沒有初始化的變量a    def inner():        y=1        return y    return innerf1.val=3f1.val2='python'

我們運行下面的測試內容來進行探索。

>>> from a import f1>>> f1.__class__        #由于Python內部采用function類來創建函數,所以函數是function類的實例,通過__class__可以看到一個實例的類。<class 'function'>>>> f1.__module__       #找到函數屬于那個模塊'a'>>> f1.__name__         #函數的名詞'f1'>>>f1.__code__          #這是f1的代碼對象,請移步"解釋型和編譯型語言的區別以及Python的運作方式"去查看。>>> f1.__globals__.keys()   #該函數能夠使用的所有全局變量,所以Python通過如果判斷函數中的變量沒有在本地定義,且不在f1.__dict__中,且不在f1.__globals__字典中,且不在f1.__modules__.__builtins__中的話,那么會報參數為定義的錯誤。dict_keys(['f1', '__name__', '__doc__', '__builtins__', '__file__', '__spec__', '__cached__', '__package__', 'g', '__loader__'])>> f1.__dict__         #如果定義了函數的屬性,那么出現在__dict__中。{'val2': 'python', 'val': 3}>>> f1.__defaults__    #如果定義了位置默認參數,那么出現在這個字典中,也就是說函數的默認參數是在函數定義的時候評估的(2, 'c')#如果默認參數獲取失敗,那么函數定義就會失敗。>>> def f(x=c):...      #默認參數評估出錯,定義階段就會報錯。... Traceback (most recent call last):  File "<stdin>", line 1, in <module>NameError: name 'c' is not defined>>> def ff(x):           #如果是函數內部變量評估出錯,那么函數定義階段捕獲報錯,但是運行階段會報錯。...   x=c... >>> ff(1)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 2, in fNameError: name 'c' is not defined>>> f1.__kwdefaults__       #關鍵字參數的默認參數放在__kedefaults__中。{'kargs': 3, 'kargs2': 'dd'}

我知道如果我們定義類,那么Python默認采用元類type來初始化該類,而且我會在元類部分詳細介紹其運作方式。
我知道我們的函數是通過class function來初始化的,但是具體的運作方式有所不知,如果你知道哪里有介紹內容,

類和實例的重要屬性

這個很重要,我們先稍微了解一下,在下面幾篇文章中,我會著重介紹。
先定義一個簡單的類:
a.py

g=55class Desc:    def __get__(self,ins, cls):        print(self)class A:    arg=2    arg2=Desc()    def __init__(self, name, age):        self.name = name        self.age=age    def f2(self,x=1):        y='a'        print(x)

下面開始我們的測試:

>>> from a import A>>> dir(A)      #所有A可以用的屬性名列表['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'arg', 'arg2', 'f2']>>> A.__doc__       #A的文檔字符串>>> A.f2            #A中定義的方法f2,每個定義的方法名都會出現在A.__dict__中。<function A.f2 at 0x7f970a8d2bf8>>>> A.__module__    #A所在的模塊名。'a'>>> A.arg       #A中的所有屬性都會出現在A.__dict__中。2>>> A.arg2      #這是A的arg2屬性,是一個描述符對象。<a.Desc object at 0x7f11f25e7588>>>> A.__dict__      #類A的__dict__屬性,這是一個相當重要的屬性。mappingproxy({'arg': 2, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, 'arg2': <a.Desc object at 0x7f9708995550>, '__module__': 'a', '__dict__': <attribute '__dict__' of 'A' objects>, 'f2': <function A.f2 at 0x7f970a8d2bf8>})>>> ins=A('js',22)>>> ins.__dict__        #這是A的實例ins的__dict__對象,在很多時候,該屬性需要看類A的__dict__的臉色。{'age': 22, 'name': 'js'}

總結

  1. 模塊、類、函數均有以下屬性:
    __dict__:該對象的屬性字典。
    __doc__:返回說明性的文字,定義在塊語句的最前面
    __name__:返回該對象的名字

  2. 類、函數均有以下屬性:
    __module,用來返回該對象的模塊名。
    __class__:用來返回類的類型(或者實例的類)、或者函數的類型
    __globals__:用來返回該對象所有可用的全局變量名。

  3. 模塊有__file__屬性,用來返回模塊包含路徑的文件名,有__builtins__屬性,用來返回所有的可以使用的內置函數、內置異常對象、內置保留字等對象。
    無論在任何位置,Python均會按照LEGB法則,在最后搜索模塊的__builtins__屬性,來最后判斷該變量是否已經定義。

  4. 模塊、類、寒酸通過調用dir函數,可以得到該對象實際可以使用的所有屬性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江西省| 兴城市| 马公市| 仁布县| 阜阳市| 苍南县| 墨竹工卡县| 翁源县| 天峻县| 芦溪县| 九江县| 武义县| 高安市| 桐城市| 页游| 怀柔区| 繁昌县| 福鼎市| 长岭县| 阿巴嘎旗| 隆化县| 会同县| 忻州市| 宜君县| 玛纳斯县| 高安市| 石城县| 崇州市| 高平市| 永和县| 怀柔区| 景宁| 上栗县| 邯郸县| 滦南县| 烟台市| 临沂市| 石渠县| 琼结县| 天水市| 溧阳市|