PYTHON部分基礎(chǔ)D4

Decorator裝飾器

# 裝飾器的語法是將@裝飾器名狠角,放在被裝飾對象上面。
# 一個(gè)函數(shù)可以被多個(gè)函數(shù)裝飾
def outer1(func):
    def inner(*args,**kwargs):
        print("認(rèn)證成功!")
        result = func(*args,**kwargs)
        print("日志添加成功")
        return result
    return inner


def outer2(func):
    def inner(*args,**kwargs):
        print("一條歡迎信息煤惩。觅够。奋蔚。")
        result = func(*args,**kwargs)
        print("一條歡送信息饼齿。屡萤。锈死。")
        return result
    return inner


@outer1
@outer2
def f1(name,age):
    print("%s 正在連接業(yè)務(wù)部門1數(shù)據(jù)接口......"%name)

# 調(diào)用方法
f1("jack",18)
------------------------------------------------------------------------
認(rèn)證成功贫堰!
一條歡迎信息。待牵。其屏。
jack 正在連接業(yè)務(wù)部門1數(shù)據(jù)接口......
一條歡送信息。缨该。偎行。
日志添加成功

裝飾器自己可以有參數(shù)

# 認(rèn)證函數(shù)
def  auth(request,kargs):
    print("認(rèn)證成功!")
# 日志函數(shù)
def log(request,kargs):
    print("日志添加成功")
# 裝飾器函數(shù)贰拿。接收兩個(gè)參數(shù)蛤袒,這兩個(gè)參數(shù)應(yīng)該是某個(gè)函數(shù)的名字。
def Filter(auth_func,log_func):
    # 第一層封裝膨更,f1函數(shù)實(shí)際上被傳遞給了main_fuc這個(gè)參數(shù)
    def outer(main_func):
        # 第二層封裝妙真,auth和log函數(shù)的參數(shù)值被傳遞到了這里
        def wrapper(request,kargs):
            # 下面代碼的判斷邏輯不重要,重要的是參數(shù)的引用和返回值
            before_result = auth(request,kargs)
            if(before_result != None):
                return before_result;

            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;

            after_result = log(request,kargs)
            if(after_result != None):
                return after_result;

        return wrapper
    return outer
# 注意了荚守,這里的裝飾器函數(shù)有參數(shù)哦珍德,它的意思是先執(zhí)行filter函數(shù)
# 然后將filter函數(shù)的返回值作為裝飾器函數(shù)的名字返回到這里练般,所以,
# 其實(shí)這里菱阵,F(xiàn)ilter(auth,log) = outer , @Filter(auth,log) =  @outer
@Filter(auth,log)
def f1(name,age):

    print("%s 正在連接業(yè)務(wù)部門1數(shù)據(jù)接口......"%name)

# 調(diào)用方法
f1("jack",18)

#-----------------------------------------------
運(yùn)行結(jié)果:

認(rèn)證成功踢俄!
jack 正在連接業(yè)務(wù)部門1數(shù)據(jù)接口......
日志添加成功

內(nèi)置函數(shù)

>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}

文件讀寫

# 對于w+模式,在讀寫之前都會清空文件的內(nèi)容晴及,建議不要使用都办!
# 對于a+模式,永遠(yuǎn)只能在文件的末尾寫入虑稼,有局限性琳钉,建議不要使用!
# 對于r+模式蛛倦,也就是讀寫模式歌懒,配合seek()和tell()方法,可以實(shí)現(xiàn)更多操作溯壶。
>>> f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')
>>> f.read()
'GBK'

Python3的繼承機(jī)制

子類在調(diào)用某個(gè)方法或變量的時(shí)候及皂,首先在自己內(nèi)部查找,如果沒有找到且改,則開始根據(jù)繼承機(jī)制在父類里查找验烧。
根據(jù)父類定義中的順序,以深度優(yōu)先的方式逐一查找父類又跛!
image.png

image.png

成員保護(hù)和訪問限制

# 在成員的名字前加上兩個(gè)下劃線__碍拆,這個(gè)成員就變成了一個(gè)私有成員(private)。
# 私有成員只能在類的內(nèi)部訪問慨蓝,外部無法訪問感混。
# 訪問和修改,在類的內(nèi)部創(chuàng)建外部可以訪問的get和set方法!
# 投機(jī)取巧的話礼烈,你可以通過_ People__age在類的外部訪問__age變量
class People:
    title = "人類"

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def print_age(self):
        print('%s: %s' % (self.__name, self.__age))

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name


obj = People("jack", 18)
obj.__name = "tom"          # 注意這一行
print("obj.__name:  ", obj.__name)
print("obj.get_name():  ", obj.get_name())
-------------------
打印結(jié)果:
obj.__name:   tom
obj.get_name():   jack

@property裝飾器

# Python內(nèi)置的@property裝飾器可以把類的方法偽裝成屬性調(diào)用的方式弧满。
# 也就是本來是Foo.func()的調(diào)用方法,變成Foo.func的方式济丘。
class People:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if isinstance(age, int):
            self.__age = age
        else:
            raise ValueError

    def del_age(self):
        print("刪除年齡數(shù)據(jù)谱秽!")

    # 核心在這句
    age = property(get_age, set_age, del_age, "年齡")    


obj = People("jack", 18)
print(obj.age)
obj.age = 19
print("obj.age:  ", obj.age)
del obj.age
---------------------------
18
obj.age:   19
刪除年齡數(shù)據(jù)!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摹迷,一起剝皮案震驚了整個(gè)濱河市疟赊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峡碉,老刑警劉巖近哟,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲫寄,居然都是意外死亡吉执,警方通過查閱死者的電腦和手機(jī)疯淫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳玫,“玉大人熙掺,你說我怎么就攤上這事」舅蓿” “怎么了币绩?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長府阀。 經(jīng)常有香客問我缆镣,道長,這世上最難降的妖魔是什么试浙? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任董瞻,我火速辦了婚禮,結(jié)果婚禮上田巴,老公的妹妹穿的比我還像新娘钠糊。我一直安慰自己,他們只是感情好壹哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布眠蚂。 她就那樣靜靜地躺著,像睡著了一般斗躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昔脯,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天啄糙,我揣著相機(jī)與錄音,去河邊找鬼云稚。 笑死隧饼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的静陈。 我是一名探鬼主播燕雁,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲸拥!你這毒婦竟也來了拐格?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤刑赶,失蹤者是張志新(化名)和其女友劉穎捏浊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撞叨,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡金踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年浊洞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡岔。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡法希,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶瘸,到底是詐尸還是另有隱情苫亦,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布奕锌,位于F島的核電站著觉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惊暴。R本人自食惡果不足惜饼丘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辽话。 院中可真熱鬧肄鸽,春花似錦、人聲如沸油啤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽益咬。三九已至逮诲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幽告,已是汗流浹背梅鹦。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冗锁,地道東北人齐唆。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像冻河,于是被迫代替她去往敵國和親箍邮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 部分細(xì)節(jié)自己改了點(diǎn)叨叙,也加了點(diǎn)自己例子锭弊,基本上屬于轉(zhuǎn)載。轉(zhuǎn)載出處:https://my.oschina.net/le...
    洛克黃瓜閱讀 1,974評論 0 3
  • 本文為《爬著學(xué)Python》系列第四篇文章摔敛。從本篇開始廷蓉,本專欄在順序更新的基礎(chǔ)上,會有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,501評論 4 11
  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”桃犬,多了一個(gè)“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钌层病傩浴?..
    victorsungo閱讀 1,501評論 0 6
  • 一、裝飾器的基本使用 在不改變函數(shù)源代碼的前提下攒暇,給函數(shù)添加新的功能土匀,這時(shí)就需要用到“裝飾器”。 0.開放封閉原則...
    NJingZYuan閱讀 527評論 0 0
  • 項(xiàng)目 https://github.com/liuhuagui/smalldoc 一個(gè)基于Java標(biāo)準(zhǔn)注釋的 RE...
    蜀黍凱閱讀 760評論 0 0