python最多接受2个参数

2024-04-19 17:12:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究简单的strategy模式实现。我是从Java世界来到Python的,所以我把所有的类划分成不同的文件,因为这对我来说似乎没问题。但我有麻烦的包装和进口,请参阅下面的代码的细节。你知道吗

所以我有一只鸭子和两种不受约束的行为:飞和呱呱。你知道吗

总体结构为:

behavior/
├── __init__.py
├── __init__.pyc
├── __pycache__
│   └── __init__.cpython-37.pyc
├── fly
│   ├── FlyBehavior.py
│   ├── FlyBehavior.pyc
│   ├── FlyNoWay.py
│   ├── FlyRocketPowered.py
│   ├── FlyRocketPowered.pyc
│   ├── FlyWithWings.py
│   ├── __init__.py
│   ├── __init__.pyc
│   └── __pycache__
│       ├── FlyBehavior.cpython-37.pyc
│       ├── FlyRocketPowered.cpython-37.pyc
│       └── __init__.cpython-37.pyc
└── quack
    ├── MuteQuack.py
    ├── Quack.py
    ├── QuackBehavior.py
    ├── Squeak.py
    └── __init__.py
duck
├── Duck.py
├── MallardDuck.py
├── ModelDuck.py
├── __init__.py
├── __init__.pyc
└── __pycache__
    ├── Duck.cpython-37.pyc
    ├── MallardDuck.cpython-37.pyc
    └── __init__.cpython-37.pyc
MiniDuckSimulator.py
MiniDuckSimulator.pyc

飞行类:

飞行行为.py

from abc import ABC, abstractmethod

class FlyBehavior(ABC):

    @abstractmethod
    def fly(self):
        pass

飞度.py

from behavior.fly import FlyBehavior

class FlyNoWay(FlyBehavior):

    def fly(self):
        print("I can't fly")

飞行火箭动力.py

from behavior.fly import FlyBehavior

class FlyRocketPowered(FlyBehavior):

    def fly(self):
        print("I'm flying with a rocket")

带翅膀的苍蝇.py

from behavior.fly import FlyBehavior

class FlyWithWings(FlyBehavior):

    def fly(self):
        print("I'm flying!")

庸医班:

江湖行为.py

from abc import ABC, abstractmethod

class QuackBehavior(ABC):

    @abstractmethod
    def quack(self):
        pass

庸医

from behavior.quack import QuackBehavior

class Quack(QuackBehavior):

    def quack(self):
        print('Quack')

MuteQuack.py公司

from behavior.quack import QuackBehavior

class MuteQuack(QuackBehavior):

    def quack(self):
        print('<< Silence >>')

吱吱作响的

from behavior.quack import QuackBehavior

class Squeak(QuackBehavior):

    def quack(self):
        print('Squeak')

鸭子类:

鸭子.py

from abc import ABC, abstractmethod

class Duck(ABC):

    fly_behavior = None
    quack_behavior = None

    @abstractmethod
    def display(self):
        pass

    def perform_fly(self):
        self.fly_behavior.fly()

    def perform_quack(self):
        self.quack_behavior.quack()

    def swim(self):
        print('All ducks float, even decoys!')

野鸭.py

from duck import Duck

class MallardDuck(Duck):

    def __init__(self):
        self.quack_behavior = Quack()
        self.fly_behavior = FlyWithWings()

    def display(self):
        print("I'm a real Mallard duck")

模型鸭.py

from duck import Duck

class ModelDuck(Duck):

    def __init__(self):
        self.fly_behavior = FlyNoWay()
        self.quack_behavior = Quack()

    def display(self):
        print("I'm a model duck")

和主类:

迷你鸭模拟器.py

from duck import MallardDuck
from duck import ModelDuck
import behavior.fly.FlyRocketPowered as FlyRocketPowered

if __name__ == "__main__":
    mallard = MallardDuck()
    mallard.display()
    mallard.perform_fly()
    mallard.perform_quack()

    model = ModelDuck()
    model.display()
    model.perform_fly()
    model.fly_behavior = FlyRocketPowered()
    model.perform_fly()

程序输出:

$ python MiniDuckSimulator.py 
Traceback (most recent call last):
  File "MiniDuckSimulator.py", line 1, in <module>
    from duck import MallardDuck
  File "/Users/p/Documents/Develop/patterns_book/00_strategy/py/duck/MallardDuck.py", line 3, in <module>
    class MallardDuck(Duck):
TypeError: module() takes at most 2 arguments (3 given)

我的模块怎么了?我存储和构造代码/类的方法可以吗?谢谢。你知道吗


Tags: frompyimportselfinitdefclasspyc
1条回答
网友
1楼 · 发布于 2024-04-19 17:12:51

应该是的

from duck.MallardDuck import MallardDuck

您要导入的MallardDuck仍然是一个文件,而不是一个类,即使其中只有一个类。你知道吗

以类似的方式更改所有其他导入。你知道吗

注意事项:

  • 策略模式在python中有点无用,可以直接将函数作为参数传递,而不是将其包装在类中
  • 没有理由让每个文件都有一个类,使用文件根据你的判断对相关的类进行分组
  • 按照惯例,模块(文件)名都是小写的,类名只有大小写

相关问题 更多 >