簡體   English   中英

如何使用 super() 方法在基類的 if 條件中更改變量?

[英]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_datadefault_validity_startdefault_c*_validity_end以查看它們是否直接屬於您的類結構。 它肯定會使您展示的代碼部分變得更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM