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)先的方式逐一查找父類又跛!
成員保護(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ù)!