使用Python创建和实现接口?

Spa*_*rky 3 java design-patterns python-2.7

我有两(2)个问题:首先,如何interface使用Python 创建FlyBehavior ?其次,如何implement使用Python在FlyWithWings类中的FlyBehavior接口(请参见下文)?我正在从头开始学习设计模式,并且想使用Python重写以下Java类

public abstract class Duck {

    // Reference variables for the 
    // behavior interface types
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck() {
    }

    // Delegate to the behavior class
    public void performFly(){
        flyBehavior.fly();
    }

    // Delegate to the behavior class
    public void performQuack(){
        quackBehavior.quack();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是所有飞行行为类实现的接口

public interface FlyBehavior {
    public void fly();
}
Run Code Online (Sandbox Code Playgroud)

这是做鸭子飞行行为的实现

public class FlyWithWings implements FlyBehavior {
    public void fly(){
    System.out.println("I'm flying");
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我使用Python所拥有的。以下是我的Python抽象Duck类

import abc

class Duck:
    __metaclass__=abc.ABCMeta


    FlyBehavior FlyBehavior;
    QuackBehavior QuackBehavior;

    @abc.abstractmethod
    def __init__():
        return

    @abc.abstractmethod
    def performFly():
        return

    @abc.abstractmethod
    def performQuack():
        return
Run Code Online (Sandbox Code Playgroud)

这是我在尝试创建接口并尝试实现接口时遇到的问题。

Ale*_*lor 6

Python 是一种鸭子类型语言。您不需要接口 - 您传入一个对象,如果它支持您想要的方法,它就可以工作。如果没有这个方法,它就会爆炸。它没有 Java 那样的编译时检查。如果您需要检查,您可以在运行时自行执行。所以它应该只是:

import abc

class Duck:
    __metaclass__=abc.ABCMeta


    FlyBehavior FlyBehavior;
    QuackBehavior QuackBehavior;

    @abc.abstractmethod
    def __init__():
        return

    @abc.abstractmethod
    def performFly():
        flyBehavior.fly()

    @abc.abstractmethod
    def performQuack():
        quackBehavior.quack()
Run Code Online (Sandbox Code Playgroud)

从更广泛的角度来看,并非所有设计模式都适用于所有语言。请参阅设计模式是否缺少语言功能

  • 关于设计模式不适用于所有语言的观点很好。 (3认同)

use*_*751 5

正如Alex Taylor所指出的那样,Python是一种鸭子式语言-您无需指定事物的类型,只需使用它们即可。

但是,我认为他对Java代码的翻译是错误的。您无需在abc这里使用-只需使用普通的类即可。

class Duck(object):
    # Like in Java, you don't need to write a __init__ if it's empty

    # You don't need to declare fields either - just use them.

    def performFly(self):
        self.flyBehaviour.fly()

    def performQuack(self):
        self.quackBehaviour.quack()

class FlyWithWings(object):
    def fly(self):
        print "I'm flying"

# Example:
d = Duck()
d.flyBehaviour = FlyWithWings()
d.performFly() # prints "I'm flying"
Run Code Online (Sandbox Code Playgroud)