從原始碼或者某處找出比較實用的寫法

2022-07-07 11:21:14 字數 2010 閱讀 9061

該文章持續跟新,看見好的寫法就往上放

1 __call__裝飾器+描述符

2 使用__call__方法將類定義為裝飾器

1 __call__裝飾器+描述符  

靈感來自bottle原始碼中描述符的適用

下面是模擬bottle描述符大致的寫法

class

describer(object):

def__init__

(self):

self._func =none

#用__call__實現類的裝飾器

def__call__

(self, func):

print

'im describer call

'self._func =func

return

self

def__get__

(self, instance, owner):

self._func(instance)

instance.foo2()

return 123

class

foo(object):

def__init__

(self):

pass

@describer()

deffoo(self):

print

'im foo instance foo

'def

foo2(self):

print

'im foo instance foo2

'f =foo()

#注意,因為使用了描述符,所以類方法會被封裝在描述符中,而這個方法會被描述符作為屬性返回

#所以foo作為描述符的屬性方法存在

print f.foo

裡面有有兩塊需要注意  

1.1 __call__ 方法的返回值是describer的物件obj。所以被裝飾的函式都屬於描述符的屬性方法

1.2 這種裝飾器+描述符的方式可以change自己想要change的方法

2 使用 __call__ 方法將類定義為裝飾器  

當然也可以使用靜態方法或者類方法

class

describer(object):

def__init__

(self, name):

self.name =name

def__call__(self, func): #

func 是 foo().foo

print

'im describer call

'def inner(foo_self, *args): #

foo_self是foo()物件

print

foo_self.name

return func(foo_self, *args)

return

inner

class

foo(object):

def__init__

(self):

self.name = '

www'

@describer(

'zhn

') #

相當於 temp = describer(__init__); inner = temp__call__(foo); func_result = inner(foo_self, *args)

deffoo(self):

return

'im foo instance foo

'f =foo()

print

f.foo()

#out

#im describer call

#www

#im foo instance foo

使用類裝飾器會讓顯得更具有封裝性和豐富性

比較通用的 stdafx h 原始碼

stdafx.h 標準系統包含檔案的包含檔案,或是經常使用但不常更改的 特定於專案的包含檔案 pragma once ifndef secure atl define secure atl 1 endif ifndef vc extralean define vc extralean 從 windo...

彙編原始碼學習1 找出最大的數

找出最大的數,存放在al assume cs code1,ss stack1,ds data1 data1 segment array db 1,8,9,2,5,4,7,6,3,10 data1 ends stack1 segment stack 這裡必須加stack db 256 dup stac...

從原始碼的角度理解Volley

今天從原始碼的角度來理解一下volley中部分功能的實現。新增請求到請求佇列 將請求新增到請求佇列中 public requestadd requestrequest 為請求設定順序編號.request.setsequence getsequencenumber 新增標記 request.addma...