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