1 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
何時(shí)使用基于類的驗(yàn)證器?
在您的示例中,基于函數(shù)的驗(yàn)證器就足夠了。如果您需要 OOP、類和對象的優(yōu)點(diǎn),那么您應(yīng)該切換到基于類的驗(yàn)證器。想象一下以下非常虛構(gòu)的源代碼:
class StartsWithValidator():
def __init__(self, starts_with):
self.starts_with = starts_with
def __call__(self, value):
if not str(value).startswith(self.starts_with):
raise ValidationError(
'Your string does not start with: {}!'.format(self.starts_with),
params={'value': value}
)
my_validator = StartsWithValidator('123')
test_string = '123OneTwoThree'
my_validator(test_string) # Will it pass the validator?
您可以在這里看到不同的品質(zhì):
通過基于類的驗(yàn)證器,您可以使用對象。對象共享相同的功能但具有不同的內(nèi)部狀態(tài)。您現(xiàn)在可以設(shè)置一個(gè)驗(yàn)證器,它檢查字符串是否以“abc”、“123”開頭,而無需編寫新代碼
starts_with_abc = StartsWithValidator('abc')
starts_with_123 = StartsWithValidator('123')
starts_with_whatever = StartsWithValidator('whatever')
您可以使用繼承。想象一下,您想要在其他功能中重用starts-with-validation,您只需從“StartsWithValidator”類繼承即可。
class StartsWithABCValidator(StartsWithValidator):
def __init__(self):
super().__init__('ABC')
def __call__(self, value):
super().__call__(value)
如果你的驗(yàn)證器做了很多復(fù)雜的事情,一個(gè)簡單的函數(shù)可能會導(dǎo)致可讀性差的代碼。如果您使用類,您就可以封裝您的功能并將其分組在一起。
添加回答
舉報(bào)