最近在思考__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...