首页 > 解决方案 > 遵循策略模式;授予对父属性/方法的接口访问权限

问题描述

我正在学习策略模式,我想在动态分配的函数中使用父类属性。

例如(你可以猜到这本书):

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. 但是我遇到了需要十几个属性的函数的问题,这些属性变得难以维护。

标签: pythonpython-3.x

解决方案


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}")

推荐阅读