调用子类函数以减少代码复制

问题描述 投票:2回答:2

我希望通过在父类中使用通用代码来减少子类中的代码复制,但仍需要根据子类进行一些特定的处理。我知道从父母那里叫孩子是不好的。如何完成代码减少? (或者我应该尝试吗?)

这是一个示例:

class Address:

    def __init__(self, street, city, postal_code):

        self._street = street
        self._city = city
        self._postal_code = self.valid_postal_code(postal_code)

    def valid_postal_code(self, postal_code):
        """ Returns a validated postal code """
        #
        # A big bunch of code common to all postal codes
        #

        if child == Usa:
            return Usa.valid_postal_code(postal_code)
        else:
            return Canada.valid_postal_code(postal_code)    

class Usa(Address):

    def valid_postal_code(self, postal_code):
        """ Returns a validated US zip code """
        # Must be 5 digits or 5 digits plus dash 4 digits
        if len(postal_code) != 5 and len(postal_code) != 10:
            raise Exception("Bad postal code")

        return postal_code


class Canada(Address):

    def valid_postal_code(self, postal_code):
        """ Returns a validates Canadian postal code """
        # Must be A#A #A#
        if len(postal_code) == 6:
            postal_code = postal_code[0:3] + " " + postal_code[3:3]
        if len(postal_code) != 7:
            raise Exception("Bad postal code")

        return postal_code.upper()
python class reduction
2个回答
0
投票

每个重写方法都应调用父方法。

class Address:

    def __init__(self, street, city, postal_code):

        self._street = street
        self._city = city
        self._postal_code = self.valid_postal_code(postal_code)

    def valid_postal_code(self, postal_code):
        """ Returns a validated postal code """
        #
        # A big bunch of code common to all postal codes
        #
        ...


class Usa(Address):

    def valid_postal_code(self, postal_code):
        """ Returns a validated US zip code """

        # Must be 5 digits or 5 digits plus dash 4 digits
        if not super().valid_postal_code(postal_code) or len(postal_code) != 5 and len(postal_code) != 10:
            raise Exception("Bad postal code")

        return postal_code


class Canada(Address):

    def valid_postal_code(self, postal_code):
        """ Returns a validates Canadian postal code """
        # Must be A#A #A#
        if len(postal_code) == 6:
            postal_code = postal_code[0:3] + " " + postal_code[3:3]
        if not super().valid_postal_code() or len(postal_code) != 7:
            raise Exception("Bad postal code")

        return postal_code.upper()

0
投票

有两种可能性:

  • 父代码包含公共部分,子代码包含特定部分
    • 父母必须返回中间结果

  • 具有两个父方法,其中一个是存根,并被子方法覆盖
    • 父母将中间结果传递到存根

第二种方法看起来像:

class Address:

    def __init__(...):

    def valid_postal_code(self, postal_code):
        """ Returns a validated postal code """
        #
        # A big bunch of code common to all postal codes
        #
        return self._validate_postal_code(postal_code)

    def _validate_postal_code(self, postal_code):
        raise NotImplementedError


class Usa(Address):

    def _validate_postal_code(self, postal_code):
        """ Returns a validated US zip code """
        # Must be 5 digits or 5 digits plus dash 4 digits
        if len(postal_code) != 5 and len(postal_code) != 10:
            raise Exception("Bad postal code")
        return postal_code


class Canada(Address):

    def _validate_postal_code(self, postal_code):
        """ Returns a validates Canadian postal code """
        # Must be A#A #A#
        if len(postal_code) == 6:
            postal_code = postal_code[0:3] + " " + postal_code[3:3]
        if len(postal_code) != 7:
            raise Exception("Bad postal code")
        return postal_code.upper()
© www.soinside.com 2019 - 2024. All rights reserved.