Python 获取一个实例以在默认情况下对其求值
我有以下Python 获取一个实例以在默认情况下对其求值,python,python-3.x,Python,Python 3.x,我有以下和课程: class GATE: def __init__(self, *args, **kwargs): inputs = args or list(kwargs.values()) assert (len(inputs) >= 2), "Must have two or more inputs for a gate." self.inputs = [int(i) for i in inputs] # def __r
和课程:
class GATE:
def __init__(self, *args, **kwargs):
inputs = args or list(kwargs.values())
assert (len(inputs) >= 2), "Must have two or more inputs for a gate."
self.inputs = [int(i) for i in inputs]
# def __repr__(self):
# return str(self.output)
class AND(GATE):
@property
def output(self):
return int(all(self.inputs))
我希望能够做到以下几点:
AND(1,1)
然后返回1
。不仅要打印该值,还要对其进行实际计算,以便我可以执行以下操作:
AND(1,AND(0,1))
我该如何以蟒蛇式的方式来做这件事?否则,我必须:
>>> AND(1,AND(0,1).output).output
0
根据Ch3steR的建议,您可以使用以下方法来获得更均匀的回报:
AND = GATE.AND
class GATE:
def AND(self, *args, **kwargs):
inputs = list(args or kwargs.values())
return int(all(inputs))
def OR...
AND=GATE().AND
>>> AND(1,AND(0,1))
0
您还可以潜在地将其从类中拉出,并使其成为一个函数,正如其他注释所建议的那样,这将使其更加简单:
def AND(*args, **kwargs):
inputs = list(args or kwargs.values())
return int(all(inputs))
>>> AND(1,AND(0,1))
0
以您想要的方式进行计算并不意味着从构造函数“返回”某些内容。这样看:如果你有一个直接的输入,你就处理它;如果你有一个门,你需要它的输出
请参阅如何执行此操作的版本:
class GATE:
def __init__(self, *args,**kwargs):
self.inputs = args or list(kwargs.values())
@property
def output(self):
raise Exception('This should be overridden')
class AND(GATE):
@property
def output(self):
result = True
for i in self.inputs:
if issubclass(i.__class__,Gate):
result = result and i.output
else:
result = result and i
return result
然后,您将运行的代码可以是:
和(真,真)。输出
为了一个简单的门。也可以是
和(和(真,和(假,假)),真)。输出
您可以得到所需的效果,即处理每个门的输出,而无需到处写入输出
你可以更进一步,以reduce为基础,让GATE子级只需定义用于减少参数的lambda,但这是另一个问题。调用返回的值(如和(1,0)
)无法同时作为和类的实例,数字0
。要么得到实例,要么得到整数结果,但不能同时得到两者
或者不完全是两者兼而有之。您可以构建类,使实例在某些上下文中的行为类似于整数。例如,如果您添加一个\uuuu int\uuu
方法,如果您将类传递给int()
,则该类将可转换为整数
其他一些类型甚至可以更容易地转换为。如果所有的门都希望有一个二进制输出值,0
或1
,那么您可以通过在类上实现\uuubool\uu
方法来获得所需的(自动计算)。Python在计算对象是否为“truthy”时使用此方法。因此,if和(…)
将按照您的预期进行计算,all([AND(…)和(…)])
(这对于实现和类可能很方便)
请注意,布尔值True
和False
分别等于整数1
和0
。bool
类是int
的子类
下面是我如何使用\uu bool\uuu
(而不是输出
)创建您的类:
如果执行lazy\u result=And(输入(“A”)),则输入(“B”)
,然后执行print(lazy\u result)
或bool(lazy\u result)
将提示用户输入整数值,并计算所需的输出。请注意,由于在all
中短循环,如果在第一个提示下输入0
,它将不会要求第二个提示,因为它不需要知道B值来给出和
的值!(在某些情况下,这可能是不可取的,因此您可能需要将all
替换为不短路的内容。)使用类根本没有意义-和应该只是一个函数。@David542:不管那些“各种其他方法、门和其他东西”是什么,他们不会改变这样做毫无意义的事实。如果您告诉我们是什么其他因素促使您采用这种奇怪的方法,我们也许可以告诉您应该做什么。@Ch3steR--谢谢,我使用过这种方法,而且效果很好。如果您只关心状态0
和1
,那么您正在寻找的方法可能是\ubool\uu
?它期望值为False
和True
,但实际上并不强制执行。默认情况下,它将由当前的输出实现在和中调用(当它处理您的输入时,由all
调用)。@David542bool(Truthy)-->True
和bool(Falsy)-->False
。您已经将和定义为实例方法,但您试图将其作为静态或类方法使用。另外,AND=GATE.和
在定义了GATE
之后才起作用。@FishingCode是的,谢谢您指出它。现在我又在玩弄它了,我不认为上面的方法太有用。这个类设计仍然没有意义。如果和
是一个实例方法,那么门
的实例应该代表什么?现在还不清楚为什么GATE
存在。@FishingCode:和(1,和(0,1))
似乎是用函数方法编写的一件非常好的事情。@David542:如果你试图编写一个硬件模拟器,我可以看到一些合理的事情和,具体取决于您希望它表示什么以及您希望模拟的详细程度。它可能只是一个和(1,0)=0
的函数,也可能是一个更详细的硬件门表示,包含诸如门延迟和状态之类的内容。如果您选择更详细的方法,那么让界面看起来像和(1,0)=0根本没有意义。
class Gate:
def __init__(self, *args, **kwargs):
self.inputs = args or list(kwargs.values()) # note, no int() calls made here
assert (len(self.inputs) >= 2), "Must have two or more inputs for a gate."
def __bool__(self):
raise NotImplementedError() # subclasses are expected to override this method
def __repr__(self):
return f"<{self.__class__.__name__}(*{self.inputs})=>{bool(self)}>"
class And(Gate):
def __bool__(self):
return all(self.inputs)
class Input:
def __init__(self, prompt):
self.prompt = prompt
def __bool__(self):
return bool(int(input(self.prompt)))
def __repr__(self):
return f"<Input: {self.prompt}>"