[英]How to change a variable in if condition of base class with super() method?
我有兩個具有類似方法的類,但變量有點不同,這是兩個類:-
class SerializerOne(object):
def validate(self, data):
instance = self.instance or self.Meta.model(**data)
instance.full_clean()
if data.get('certificate') and data.get('private_key'):
data = get_import_data(instance)
return data
def validate_validity_start(self, value):
if value is None:
value = default_validity_start()
return value
def validate_validity_end(self, value):
if value is None:
value = default_ca_validity_end()
return value
class SerializerTwo(object):
def validate(self, data):
instance = self.instance or self.Meta.model(**data)
instance.full_clean()
if data.get('certificate') and data.get('private_key'):
data = get_import_data(instance)
data.update({'ca': instance.ca})
return data
def validate_validity_start(self, value):
if value is None:
value = default_validity_start()
return value
def validate_validity_end(self, value):
if value is None:
value = default_cert_validity_end()
return value
現在這就是我試圖在基類中保留類似方法的方法:-
class BaseSerializer(object):
def validate(self, data):
instance = self.instance or self.Meta.model(**data)
instance.full_clean()
if data.get('certificate') and data.get('private_key'):
data = get_import_data(instance)
return data
def validate_validity_start(self, value):
if value is None:
value = default_validity_start()
return value
def validate_validity_end(self, value):
if value is None:
value = default_ca_validity_end()
return value
當我繼承上面的BaseSerializer
class SerializerOne(BaseSerializer):
pass
class SerializerTwo(BaseSerializer):
# Now in this class how can I add `data.update({'ca': instance.ca})` in the
# `validate` method, and also there is a bit of change in the
# method `validate_validity_end`,
我發現它可以用super()
,但我無法實現。
我會重新定義你如何分解常用方法:
class BaseSerializer:
def get_import_data_hook(self, instance):
return get_import_data(instance)
def validate(self, data):
instance = self.instance or self.Meta.model(**data)
instance.full_clean()
if data.get('certificate') and data.get('private_key'):
data = self.get_import_data_hook(instance)
return data
def default_validity_start_hook(self):
return default_validity_start()
def validate_validity_start(self, value):
if value is None:
value = default_validity_start_hook()
return value
def default_validity_end_hook(self):
return default_ca_validity_end()
def validate_validity_end(self, value):
if value is None:
value = self.default_validity_end_hook()
return value
任何時候你發現自己重用了除了一個小調整之外的所有代碼,把這個調整放在自己的鈎子里。 你不必在名稱中加上“鈎子”,我只是為了強調而這樣做。 相反,要清楚地記錄下來。
現在你可以做類似的事情
class SerializerOne(BaseSerializer):
pass
和
class SerializerTwo(BaseSerializer):
def get_import_data_hook(self, instance):
data = super().get_import_data_hook(instance)
data.update({'ca': instance.ca})
return data
def default_validity_end_hook(self):
return default_cert_validity_end()
現在,為default_validity_start_hook
制作一個單獨的鈎子似乎是多余的,但為了一致性我添加了它。 您可能還想查看函數get_import_data
、 default_validity_start
和default_c*_validity_end
以查看它們是否直接屬於您的類結構。 它肯定會使您展示的代碼部分變得更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.