簡談python中的 call

2021-10-17 18:24:28 字數 1822 閱讀 2399

最近在思考__call__和類方法的使用場景,雖然功能會有重疊,但凡存在的必是合理的,肯定會有輕微的不同,看了django以及部分框架的設計原始碼,各有各的設計風格,本著功能邊界的看法,所以做個總結。

classa:

def__init__

(self, a, b)

: self.a = a

self.b = b

defdo_staic_something

(self, c ,d)

:print

("123"

)

@staticmethod

defdo_something()

:pass

@classmethod

defdo_class_something

(cls)

:pass

def__call__

(self)

:print

("123call"

)

例項化的方法就是普通的類方法,它表達了類功能的多樣性和抽象性,傳入引數是self,使用場景必須是先例項化,在呼叫此方法。但例項化方法也是呼叫call,就是a.do_something.__call()。

staticmethod也是乙個類方法,是可以直接類呼叫的。個人認為的使用場景是:只要要定義的方法裡不涉及到self引數,就用靜態方法承擔。因為這樣就表明這個方法和本身的類沒有關係,明確的區別出類相關和不相關。

classmethod是區別與staticmethod的又乙個類方法,也是類直接可呼叫的。它接受的第乙個引數是cls,傳入類的用途就是為了init不足而構造新物件。比如工廠模式,不斷的用classmethod方法創造新產品,每個classmethod就像一條流水線,生產出來新的產品物件,供使用者拿去使用。而且因為不用例項化,寫法也比較優雅。

另外,classmethod可以作為實現的視窗函式。先將要實現的功能全部抽象化,然後寫在呼叫處實現視窗。之後通過子類的重寫引數以及修改需要的邏輯方法,就可以在不改變**的情況下通過繼承來展示類的多型,也符合物件的多繼承少修改原則。栗子比如django的view類中的as_view。

魔法方法call,相當於給類加上了callable屬性,和普通函式一樣可以被呼叫。個人認為的使用場景:

用類實現裝飾器的時候。

功能單一,實現目的簡單,輕量化。

同樣可以用作抽象視窗函式,抽象出使用規則,通過子類的改寫其他方法,在不改變原**的情況下取得不同的結果。舉個小栗子。

import pandas as pd

import os

from functools import wraps

class

csvdataprocess

:def

__init__

(self)

:def

example_one

(self)

:pass

def__call__

(self, exmaple)

:try

: target_func =

getattr

(self, exmaple)

target_func(

)except exception as e:

print

("execute error"

, e)

if __name__ ==

"__main__"

: csv = csvdataprocess(

) csv(

"example_one"

)

簡談Python中的 new 和 init

今天想跟大家談談有關python中的 new 和 init 的問題,其實這個問題對於我來說還是比較難的,想要徹底弄明白這兩個的區別的確不是一件容易的事情。下面就是我自己的一些簡單的看法。首先我們要明白一點的是,只有繼承於object的類,或者更準確的說,祖先類是object類才有 new 方法,其他...

深圳Python學習 簡談Python的列表排序

python的內建函式sorted 從可迭代物件中的項返回乙個新的排序列表。語法 sorted iterable,key none,reverse false 該函式有兩個可選引數,必須指定為關鍵字引數。key引數指明列表中元素的比較方式,如按字母比較排序 key str.lower key引數的預...

Python中的call方法

在 python 中提供了 call 方法,允許建立可呼叫的物件 例項 如果類中實現了 call 方法,則可以像使用函式一樣使用類。usr bin env python coding utf 8 class run object def init self pass def call self,da...