python - 遵循策略模式;授予对父属性/方法的接口访问权限
问题描述
我正在学习策略模式,我想在动态分配的函数中使用父类属性。
例如(你可以猜到这本书):
class Duck():
def __init__(self, wingspan: int, quack_behavior, fly_behavior):
self.wingspan = wingspan
self.quack = quack_behavior.quack
self.fly = fly_behavior.fly
def quack(self):
pass
def fly(self):
pass
class FlyWithWings():
def fly(self):
print("I'm flying with wings")
print(f"speed of {self.wingspan*1.1}")
class Quack():
def quack(self):
print("Quack, quack!")
class MallardDuck(Duck):
def __init__(self):
super().__init__(wingspan=22, quack_behavior=Quack(), fly_behavior = FlyWithWings())
if __name__ == "__main__":
# welcome to the duck pond simulator
first_duck = MallardDuck()
first_duck.quack()
first_duck.fly()
这失败了
AttributeError: 'FlyWithWings' object has no attribute 'wingspan'
附注:我违反了松散耦合原则,因为FlyWithWings()
类依赖于一个名为wingspan
. 但是我遇到了需要十几个属性的函数的问题,这些属性变得难以维护。
解决方案
FlyWithWings
不知道wingspan
它正在使用的对象的具体情况。您可以wingspan
使用 using创建一个闭包functools.partial
。这将创建一个带有“冻结”参数的函数对象。所以你可以这样做:
from functools import partial
class Duck():
def __init__(self, wingspan: int, quack_behavior, fly_behavior):
self.wingspan = wingspan
self.quack = quack_behavior.quack
self.fly = partial(fly_behavior.fly, wingspan)
并更改FlyWthWings
为:
class FlyWithWings():
def fly(self, wingspan):
print("I'm flying with wings")
print(f"speed of {wingspan*1.1}")
推荐阅读
- python - 如何用该字典的键替换列向量中等于我拥有的字典的值的元素
- android - 从手机连接到 Azure 虚拟机
- c# - WeakReference 返回错误的对象
- java - Alfresco 批量导入元数据失败
- opengl - 什么取代了 CUDA 中的纹理参考管理
- java - 在 web.xml 或 weblogic.xml 中引用 Weblogic 12.2.1.3.0 中的自定义身份验证提供程序
- java - @ManyToMany 的实体不使用 Spring-Boot 和 Spring-JPA 保存
- python - 对组中的条目进行排序并按字母顺序返回第一个
- php - PHP exec缺少最后一行
- python - 从分组数据中绘制一些值