Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的类、方法和多态性_Python_Oop_Timer_Polymorphism - Fatal编程技术网

Python中的类、方法和多态性

Python中的类、方法和多态性,python,oop,timer,polymorphism,Python,Oop,Timer,Polymorphism,我制作了一个模块原型,目的是用python构建复杂的计时器时间表。类原型模拟计时器对象,每个对象都有等待时间、将计时器和其他重复对象分组的重复对象,以及一个Schedule类,仅用于保存整个构造或计时器和重复实例。结构可以根据需要复杂,需要灵活 这三个类中的每一个都有一个.run()方法,允许遍历整个计划。无论类是什么,.run()方法要么运行计时器,要么在一定次数的迭代中运行重复组,要么运行计划 这种面向多态性的方法是合理的还是愚蠢的?还有什么其他合适的方法,我应该考虑建立这样一个多用途的实用

我制作了一个模块原型,目的是用python构建复杂的计时器时间表。类原型模拟计时器对象,每个对象都有等待时间、将计时器和其他重复对象分组的重复对象,以及一个Schedule类,仅用于保存整个构造或计时器和重复实例。结构可以根据需要复杂,需要灵活

这三个类中的每一个都有一个
.run()
方法,允许遍历整个计划。无论类是什么,
.run()
方法要么运行计时器,要么在一定次数的迭代中运行重复组,要么运行计划

这种面向多态性的方法是合理的还是愚蠢的?还有什么其他合适的方法,我应该考虑建立这样一个多用途的实用工具,允许把所有的积木放在一起,以复杂的方式,以简单的要求?< /P> 谢谢

以下是模块代码:

#####################
## Importing modules

from time import time, sleep


#####################
## Class definitions

class Timer:
    """
    Timer object with duration.

    """
    def __init__(self, duration):
        self.duration = duration
    def run(self):
        print "Waiting for %i seconds" % self.duration
        wait(self.duration)
        chime()

class Repeat:
    """
    Repeat grouped objects for a certain number of repetitions.

    """
    def __init__(self, objects=[], rep=1):
        self.rep = rep
        self.objects = objects
    def run(self):
        print "Repeating group for %i times" % self.rep
        for i in xrange(self.rep):
            for group in self.objects:
                group.run()

class Schedule:
    """
    Groups of timers and repetitions. Maybe redundant with class Repeat.

    """
    def __init__(self, schedule=[]):
        self.schedule = schedule
    def run(self):
        for group in self.schedule:
            group.run()

########################
## Function definitions

def wait(duration):
    """
    Wait a certain number of seconds.

    """
    time_end = time() + float(duration) #uncoment for minutes# * 60
    time_diff = time_end - time()
    while time_diff > 0:
        sleep(1)
        time_diff = time_end - time()

def chime():
    print "Ding!"

它被调用,并且一直在Python中使用。

它确实一直在使用,而且非常好。如果您想非常小心,可以使用
hasattr
来确保希望运行
run
方法的对象实际上很早就有了一个方法。这有助于确保抛出的异常尽可能接近错误点


但除此之外,这是很好的,而且经常进行。

基于duck类型的方法很好。如果您希望能够检查给定的类是否应该在您的框架中运行,那么可以使用(需要Python 2.6)。政治公众人物3119声明:

[…]有许多不同的方法来测试对象是否符合特定的协议。例如,如果询问“此对象是可变序列容器吗?”,可以查找“list”基类,也可以查找名为“getitem”的方法。但是请注意,尽管这些测试看起来很明显,但它们都不正确,因为一个测试会产生误报,而另一个测试会产生误报。[…]本PEP提出了一种特殊的策略来组织这些测试,称为抽象基类或ABC。ABC只是添加到对象继承树中的Python类,用于向外部检查器发送该对象某些特性的信号。测试是使用isinstance()完成的,存在特定的ABC表示测试已通过

您可以实现ABC并使用
isinstance
issubclass
来测试是否为您的框架编写了类或实例:

from abc import ABCMeta, abstractmethod

class Runnable(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def run(self):
        raise NotImplementedError

 class Schedule(Runnable):
     ...
重要的一点是,还可以将其他类(您可能无法控制,因为您没有编写它们)注册为可运行类,
isinstance
issubclass
方法将反映:

  >>> issubclass(SomeOtherClass, Runnable)
  False
  >>> Runnable.register(SomeOtherClass)
  >>> issubclass(SomeOtherClass, Runnable)
  True

为什么不使用新样式的类?为什么不
classx(object):
?您已经考虑了Python中的全局锁和并发中的困难,我希望如此。S.Lott:您指的是继承吗?如果是的话,我应该调查一下,谢谢你的建议。如果没有,具体是什么?我不确定我是否知道“新型课程”是关于什么的。Cheers@Morlock:您可能需要考虑更改标题,因为“类方法”是不明确的,通常与类方法decorator结合使用:从您的回答中,我可以“猜测”很多事情。我可以猜到1)因为它一直在使用,所以它很好;2) 因为你“一直”用斜体字,你质疑python式的做事方式;3) 你对这个问题没有意见,但想指出我不是唯一一个这样做的人。事实上,我不知道你的意见:)不过,我真的很乐意知道。好吗?还有其他更合适的方式吗?干杯更正第1点和第3点。就“主要”方法而言,Python中的多态性是duck类型。我两个都做了,没有发现什么不同。唯一重要的区别是,当您必须在同一对象内调用其他方法以进行小的行为更改时;在这种情况下,我发现多态性更优越,因为duck类型需要重新定义整个“primary”方法。非常感谢您的澄清!我不知道这个存在。非常感谢。