在一个布尔函数之间编写一个包含两个
MyTime
对象的布尔函数 和t1
作为参数,如果调用对象掉落,则返回True 在两次之间。假设t2
,并使测试在 下限并在上限处打开, 也就是说,如果t1 <= t2
,则返回True。
现在从这个问题的措辞看来,函数中应该只应该有两个参数,但是我看不到仅通过使用两个参数来构成这种功能的方法。我的意思是,我想您可以创建另一个函数,该函数创建一个t1 <= obj < t2
对象的变量,但是我只打算将其保留为一个函数,而不是两个。该问题的措辞使您似乎应该拥有MyTime
,但我认为这不可能。是否可以仅使用两个参数来实现“介于”功能?这是我的代码
Object(Function(t1,t2))
答案 0 :(得分:5)
您是100%正确的,它确实需要三个参数。如果将其编写为MyTime
类的成员函数,它将获得第三个参数self
:
class MyTime():
# the guts of the class ...
def between(self, t1, t2):
t1seconds = t1.to_seconds()
t2seconds = t2.to_seconds()
myseconds = self.to_seconds()
return t1seconds <= myseconds < t2seconds
您可以将这种方法用于:
currentTime = MyTime(0, 0, 0)
doneTime = MyTime(10, 3, 4)
x = MyTime(2, 0, 0)
x.between(currentTime, doneTime)
通过在类的实例上调用方法,自动传递self
参数。
答案 1 :(得分:1)
该问题似乎被写成一个棘手的问题,或者只是偶然。因此,让我们弄清楚一些术语,这样我们才能真正理解它的要求。
函数定义中的变量名称为parameters。
函数调用括号内的表达式为arguments。
当然,在最简单的情况下,每个参数都只绑定到一个参数,但是在涉及*args
或**kw
(在任一侧)或默认值的情况下,情况并非如此值或方法调用。
因此,between
显然需要三个参数-但这并不意味着它需要三个参数,如果您可以找到其他合理的方法来为这些参数之一指定值
问题的措辞掩盖了最明显的答案,但它仍然是最明显的答案:您想要的是一个method,它在class MyTime:
定义中定义,与描述的完全一样在illiteratecoder's answer中(我将在此处复制):
def between(self, t1, t2):
t1seconds = t1.to_seconds()
t2seconds = t2.to_seconds()
myseconds = self.to_seconds()
return t1seconds <= myseconds < t2seconds
当然,如果您确实愿意,可以使用三个参数来调用它:
MyTime.between(x, currentTime, doneTime)
但是通常,您不会直接调用该函数,而是将其作为绑定方法来调用:
x.between(currentTime, doneTime)
当然,正如方法的词汇表所隐含的那样,通过types.MethodType
内的某些代码,在幕后,具有两个参数的方法调用变成了具有三个参数的函数调用。但是您的代码或其他任何地方都没有三参数调用。
很明显,x
(或原始语句中的obj
)是短语“调用对象”的含义,即使这是一个非常奇怪的术语。 1
如果您感到好奇,那么执行该操作的代码(或更确切地说,Python等效于C代码)如下所示:
def __call__(self, *args, **kw):
return self.__func__(self.__self__, *args, **kw)
…,其中self.__func__
是MyTime.between
,而self.self
是x
。
1。我从未听说过在Python中使用过“调用对象”。它在Smalltalk和相关语言中使用了 ,但是它表示消息发送(方法调用)的词法位置处的self
范围在此是无意义的,而在Python中通常是无意义的(与JavaScript不同)。 x
中的x.between
等效项绝对不是调用对象,它是接收对象。因此,如果这是一个棘手的问题,我认为他们超越了误导但在技术上仍然准确且只是明显的错误之间的界限。但是,另一方面,如果您的老师或书本或其他一直使用此特质术语的东西,那么这并没有错,只是有点奇怪,您可能需要回过头来学习一些笔记以确保您了解他们的知识。术语,至少是在尝试完成本课程时。