【问题标题】:Creating and Implementing an interface using Python?使用 Python 创建和实现接口?
【发布时间】:2015-04-30 01:19:11
【问题描述】:

我有两 (2) 个问题:首先,如何使用 Python 创建 FlyBehavior interface?其次,我如何implement FlyWithWings 类中的FlyBehavior 接口,使用Python(见下文)?我正在通过 Head First 学习设计模式,我想使用 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();
    }
}

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

public interface FlyBehavior {
    public void fly();
}

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

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

这是我目前使用 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

这是我试图创建接口并尝试实现接口的地方。

【问题讨论】:

标签: java python-2.7 design-patterns


【解决方案1】:

Python 是一种duck typed 语言。你不需要接口——你传入一个对象,如果它支持你希望它工作的方法。如果它没有方法,它会炸毁。它没有 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()

更广泛地说,并非所有设计模式都适用于所有语言。见Are Design Patterns Missing Language Features

【讨论】:

  • 关于设计模式并不适用于所有语言的要点。
【解决方案2】:

正如 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"

【讨论】:

  • 最后一行不应该是:'d.performFly()' 吗?
猜你喜欢
  • 2023-03-26
  • 2020-11-21
  • 1970-01-01
  • 2016-08-13
  • 2011-12-28
  • 2016-10-29
  • 2015-12-25
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多