1.环球影讯节目目录
2.说说 Python çå
ç¼ç¨
环球影讯节目目录
第期:十大意乱情迷的内衣内衣代挂源码2018边缘之爱
第期:《碟中谍4》原版电视剧曝光
第期:《碟中谍4》米拍摄高清实录
第期:十部**瓦解春运N大难题
第期:《大魔术师》山寨三大理由
第期:《那些年》神似《灌篮高手》
第期:部重磅巨制年度全息像
第期:《亲密敌人》《战马》迎接
第期:《金陵十三钗》两大致命死穴
第期:《龙门飞甲》VS《新龙门客栈》
第期:《鸿门宴》冯绍峰演另类项羽
第期:《失恋天》《青春期》妖风肆虐
第期:《暮光之城4》偶像剧真面目
第期:《失恋天》炮制“脱光”手册
第期:内衣超模率花瓶军团轰炸银幕
第期:《猩球崛起》昭示世界末日
第期:《绿灯侠》登陆HOLD住姐点评制服诱惑
第期:细数银幕销魂蚀骨一夜情
第期:星座最爱**盘点
第期:《白蛇传说》PK《画壁》
第期:步步惊心史上极品穿越大盘点
第期:揭秘快乐女声真面目
第期:韩庚 吴尊 井柏然新片激战
第期:《源代码》挑战《盗梦空间》
第期:《赛车总动员》《变形金刚》大比拼
第期:《窃听风云2》主创聊窃听
第期:《死神来了5》上映
第期:《哈利·波特7》精华曝光
第期:影史最意乱情迷瞬间
第期:奥特曼蓝精灵经典再现
第期:《变形金刚3》热映
第期:《变形金刚3》即将上映
第期:《建党伟业》五大看点
第期:邓超孙俪玩仙境概念
第期:**十大恐怖身体危机
第期:揭秘《功夫熊猫2》
第期:揭秘《加勒比海盗4》
第期:3D肉蒲团引爆荷尔蒙
第期:《雷神》PK《加勒比海盗》
第期:双雄对决**盘点
第期:环球影讯之香港金像奖年金曲重温
第期:暴力萝莉**军团
第期:关云长混战歌特罗莉
第期:倩女幽魂将映 回忆十大美艳女鬼
第期:洛杉矶之战登陆 愚人节整人秘籍
第期:洛杉矶之战来袭末日生存手册
第期:洛杉矶之战必看 春季档新片攻略
第期:最基情最邪门最雷人 火星盘点奥斯卡九宗最
第期:社交网络PK国王演讲
第期:《将爱》情人节有爱之夜
第期:贺岁片开年战 中美顶级大片龙虎斗
第9期:圣诞档新片排行榜 好莱坞月观影指南
第8期:贺岁片三国杀
第7期:《哈利·波特》全集回顾
第6期:揭秘奥斯卡大热门
第5期:好莱坞月大片TOP
第4期:威尼斯独家特辑
第3期:三大国际名导巅峰对决
第2期:魔法师山楂树陈真混战秋季档
第1期:互联网影视第一指南
说说 Python çå ç¼ç¨
æå°å è¿ä¸ªåï¼ä½ ä¹è®¸ä¼æ³å°å æ°æ®ï¼å æ°æ®å°±æ¯æè¿°æ°æ®æ¬èº«çæ°æ®ï¼å 类就æ¯ç±»çç±»ï¼ç¸åºçå ç¼ç¨å°±æ¯æ述代ç æ¬èº«ç代ç ï¼å ç¼ç¨å°±æ¯å ³äºå建æä½æºä»£ç (æ¯å¦ä¿®æ¹ãçææå è£ åæ¥ç代ç )çå½æ°åç±»ã主è¦ææ¯æ¯ä½¿ç¨è£ 饰å¨ãå ç±»ãæ述符类ãæ¬æç主è¦ç®çæ¯å大家ä»ç»è¿äºå ç¼ç¨ææ¯ï¼å¹¶ä¸ç»åºå®ä¾æ¥æ¼ç¤ºå®ä»¬æ¯ææ ·å®å¶åæºä»£ç çè¡ä¸ºã
è£ é¥°å¨ è£ é¥°å¨å°±æ¯å½æ°çå½æ°ï¼å®æ¥åä¸ä¸ªå½æ°ä½ä¸ºåæ°å¹¶è¿åä¸ä¸ªæ°çå½æ°ï¼å¨ä¸æ¹ååæ¥å½æ°ä»£ç çæ åµä¸ä¸ºå ¶å¢å æ°çåè½ï¼æ¯å¦æ常ç¨ç计æ¶è£ 饰å¨ï¼
from functools import wrapsdef timeit(logger=None):"""èæ¶ç»è®¡è£ 饰å¨ï¼åä½æ¯ç§ï¼ä¿ç 4 ä½å°æ°"""def decorator(func):@wraps(func)def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)end = time.time()if logger:logger.info(f"{ func.__name__} cost { end - start :.4f} seconds")else:print(f"{ func.__name__} cost { end - start :.4f} seconds")return resultreturn wrapperreturn decorator(注ï¼æ¯å¦ä¸é¢ä½¿ç¨ @wraps(func) 注解æ¯å¾éè¦çï¼ å®è½ä¿çåå§å½æ°çå æ°æ®) åªéè¦å¨åæ¥çå½æ°ä¸é¢å ä¸ @timeit() å³å¯ä¸ºå ¶å¢å æ°çåè½ï¼
@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. secondsä¸é¢ç代ç è·ä¸é¢è¿æ ·åçæææ¯ä¸æ ·çï¼
test_timeit = timeit(test_timeit)test_timeit()è£ é¥°å¨çæ§è¡é¡ºåº å½æå¤ä¸ªè£ 饰å¨çæ¶åï¼ä»ä»¬çè°ç¨é¡ºåºæ¯æä¹æ ·çï¼
åå¦æè¿æ ·ç代ç ï¼è¯·é®æ¯å æå° Decorator1 è¿æ¯ Decorator2 ?
from functools import wrapsdef decorator1(func):@wraps(func)def wrapper(*args, **kwargs):print('Decorator 1')return func(*args, **kwargs)return wrapperdef decorator2(func):@wraps(func)def wrapper(*args, **kwargs):print('Decorator 2')return func(*args, **kwargs)return wrapper@decorator1@decorator2def add(x, y):return x + yadd(1,2)# Decorator 1# Decorator 2åçè¿ä¸ªé®é¢ä¹åï¼æå ç»ä½ æ个形象çæ¯å»ï¼è£ 饰å¨å°±åå½æ°å¨ç©¿è¡£æï¼ç¦»å®æè¿çæå ç©¿ï¼ç¦»å¾è¿çæåç©¿ï¼ä¸ä¾ä¸ decorator1 æ¯å¤å¥ï¼decorator2 æ¯å è¡£ã
add = decorator1(decorator2(add))
å¨è°ç¨å½æ°çæ¶åï¼å°±åè±è¡£æï¼å 解é¤æå¤é¢ç decorator1ï¼ä¹å°±æ¯å æå° Decorator1ï¼æ§è¡å° return func(
args, kwargs) çæ¶åä¼å»è§£é¤ decorator2ï¼ç¶åæå° Decorator2ï¼å次æ§è¡å° return func(
args, kwargs) æ¶ä¼çæ£æ§è¡ add() å½æ°ã
éè¦æ³¨æçæ¯æå°çä½ç½®ï¼å¦ææå°å符串ç代ç ä½äºè°ç¨å½æ°ä¹åï¼åä¸é¢è¿æ ·ï¼é£è¾åºçç»ææ£å¥½ç¸åï¼
def decorator1(func):@wraps(func)def wrapper(*args, **kwargs):result = func(*args, **kwargs)print('Decorator 1')return resultreturn wrapperdef decorator2(func):@wraps(func)def wrapper(*args, **kwargs):result = func(*args, **kwargs)print('Decorator 2')return resultreturn wrapperè£ é¥°å¨ä¸ä» å¯ä»¥å®ä¹ä¸ºå½æ°ï¼ä¹å¯ä»¥å®ä¹ä¸ºç±»ï¼åªè¦ä½ ç¡®ä¿å®å®ç°äº__call__() å __get__() æ¹æ³ã
å ç±» Python ä¸ææç±»ï¼objectï¼çå ç±»ï¼å°±æ¯ type ç±»ï¼ä¹å°±æ¯è¯´ Python ç±»çå建è¡ä¸ºç±é»è®¤ç type ç±»æ§å¶ï¼æ个æ¯å»ï¼type ç±»æ¯ææç±»çç¥å ãæ们å¯ä»¥éè¿ç¼ç¨çæ¹å¼æ¥å®ç°èªå®ä¹çä¸äºå¯¹è±¡å建è¡ä¸ºã
å®ä¸ä¸ªç±»ç»§æ¿ type ç±» Aï¼ç¶åè®©å ¶ä»ç±»çå ç±»æå Aï¼å°±å¯ä»¥æ§å¶ A çå建è¡ä¸ºãå ¸åçå°±æ¯ä½¿ç¨å ç±»å®ç°ä¸ä¸ªåä¾ï¼
class Singleton(type):def __init__(self, *args, **kwargs):self._instance = Nonesuper().__init__(*args, **kwargs)def __call__(self, *args, **kwargs):if self._instance is None:self._instance = super().__call__(*args, **kwargs)return self._instanceelse:return self._instanceclass Spam(metaclass=Singleton):def __init__(self):print("Spam!!!")å ç±» Singleton ç__init__å__new__ æ¹æ³ä¼å¨å®ä¹ Spam çæé´è¢«æ§è¡ï¼è __call__æ¹æ³ä¼å¨å®ä¾å Spam çæ¶åæ§è¡ã
descriptor ç±»ï¼æ述符类ï¼
descriptor å°±æ¯ä»»ä½ä¸ä¸ªå®ä¹äº __get__()ï¼__set__()æ __delete__()ç对象ï¼æè¿°å¨è®©å¯¹è±¡è½å¤èªå®ä¹å±æ§æ¥æ¾ãåå¨åå é¤çæä½ãè¿é举å®æ¹ææ¡£[1]ä¸ä¸ªèªå®ä¹éªè¯å¨çä¾åã
å®ä¹éªè¯å¨ç±»ï¼å®æ¯ä¸ä¸ªæ述符类ï¼åæ¶è¿æ¯ä¸ä¸ªæ½è±¡ç±»ï¼
from abc import ABC, abstractmethodclass Validator(ABC):def __set_name__(self, owner, name):self.private_name = '_' + namedef __get__(self, obj, objtype=None):return getattr(obj, self.private_name)def __set__(self, obj, value):self.validate(value)setattr(obj, self.private_name, value)@abstractmethoddef validate(self, value):passèªå®ä¹éªè¯å¨éè¦ä» Validator 继æ¿ï¼å¹¶ä¸å¿ é¡»æä¾ validate() æ¹æ³ä»¥æ ¹æ®éè¦æµè¯åç§çº¦æã
è¿æ¯ä¸ä¸ªå®ç¨çæ°æ®éªè¯å·¥å ·ï¼
OneOf éªè¯å¼æ¯ä¸ç»å约æçé项ä¹ä¸ã
class OneOf(Validator):def __init__(self, *options):self.options = set(options)def validate(self, value):if value not in self.options:raise ValueError(f'Expected { value!r} to be one of { self.options!r}')Number éªè¯å¼æ¯å¦ä¸º int æ floatãæ ¹æ®å¯éåæ°ï¼å®è¿å¯ä»¥éªè¯å¼å¨ç»å®çæå°å¼ææ大å¼ä¹é´ã
class Number(Validator):def __init__(self, minvalue=None, maxvalue=None):self.minvalue = minvalueself.maxvalue = maxvaluedef validate(self, value):if not isinstance(value, (int, float)):raise TypeError(f'Expected { value!r} to be an int or float')if self.minvalue is not None and value < self.minvalue:raise ValueError(f'Expected { value!r} to be at least { self.minvalue!r}')if self.maxvalue is not None and value > self.maxvalue:raise ValueError(f'Expected { value!r} to be no more than { self.maxvalue!r}')String éªè¯å¼æ¯å¦ä¸º strãæ ¹æ®å¯éåæ°ï¼å®å¯ä»¥éªè¯ç»å®çæå°ææ大é¿åº¦ãå®è¿å¯ä»¥éªè¯ç¨æ·å®ä¹ç predicateã
class String(Validator):def __init__(self, minsize=None, maxsize=None, predicate=None):self.minsize = minsizeself.maxsize = maxsizeself.predicate = predicatedef validate(self, value):if not isinstance(value, str):raise TypeError(f'Expected { value!r} to be an str')if self.minsize is not None and len(value) < self.minsize:raise ValueError(f'Expected { value!r} to be no smaller than { self.minsize!r}')if self.maxsize is not None and len(value) > self.maxsize:raise ValueError(f'Expected { value!r} to be no bigger than { self.maxsize!r}')if self.predicate is not None and not self.predicate(value):raise ValueError(f'Expected { self.predicate} to be true for { value!r}')å®é åºç¨æ¶è¿æ ·åï¼
@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. seconds0æè¿°å¨é»æ¢æ æå®ä¾çå建ï¼
@timeit()def test_timeit():time.sleep(1)test_timeit()#test_timeit cost 1. seconds1æåçè¯ å ³äº Python çå ç¼ç¨ï¼æ»ç»å¦ä¸ï¼
å¦æå¸ææäºå½æ°æ¥æç¸åçåè½ï¼å¸æä¸æ¹ååæçè°ç¨æ¹å¼ãä¸åéå¤ä»£ç ãæç»´æ¤ï¼å¯ä»¥ä½¿ç¨è£ 饰å¨æ¥å®ç°ã
å¦æå¸ææä¸äºç±»æ¥ææäºç¸åçç¹æ§ï¼æè å¨ç±»å®ä¹å®ç°å¯¹å ¶çæ§å¶ï¼æ们å¯ä»¥èªå®ä¹ä¸ä¸ªå ç±»ï¼ç¶å让å®ç±»çå ç±»æå该类ã
å¦æå¸æå®ä¾çå±æ§æ¥ææäºå ±åçç¹ç¹ï¼å°±å¯ä»¥èªå®ä¹ä¸ä¸ªæ述符类ã
以ä¸å°±æ¯æ¬æ¬¡å享çææå 容ï¼å¦æä½ è§å¾æç« è¿ä¸éï¼æ¬¢è¿å ³æ³¨å ¬ä¼å·ï¼Pythonç¼ç¨å¦ä¹ åï¼æ¯æ¥å¹²è´§å享ï¼å 容è¦çPythonçµå书ãæç¨ãæ°æ®åºç¼ç¨ãDjangoï¼ç¬è«ï¼äºè®¡ç®ççãææ¯åå¾ç¼ç¨å¦ä¹ ç½ï¼äºè§£æ´å¤ç¼ç¨ææ¯ç¥è¯ã
åæï¼/post/