python - 调用子类函数减少代码复制
问题描述
我希望通过在父类中使用公共代码来减少子类中的代码复制,但仍需要根据子类进行一些特定的处理。我知道从父母那里打电话给孩子是不好的。如何完成代码缩减?(或者我什至应该尝试?)
这是一个例子:
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()
解决方案
有两种可能:
- 让父代码包含公共部分,子代码包含细节
- 父级必须返回中间结果
或者
- 有两个父方法,其中一个是存根并被子方法覆盖
- 父级将中间结果传递给存根
第二种方法看起来像:
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()
推荐阅读
- windows - GCP - 如何在非常安全的 VPC 上向 kms.windows.googlecloud.com 注册多个 Windows 操作系统?
- webpack - 如何在实时服务器而不是本地主机上运行 vuejs-templates/webpack
- spring-boot - 使用 Spring 将参数传递给 Neo4j 中的匹配查询
- c++ - 将数组附加到向量中
- hazelcast - 为 hazelcast 集群成员添加自定义名称?
- node.js - 服务器上无法识别 Socket.io 语法
- angular - 编写验证器时出错
- go - 在模板中转义大括号
- mysql - 过滤没有子查询的值
- java - 获取 SWT 视图的大小