我有以下AND类:
class GATE:
def __init__(self, \*rgs, \*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))
我将如何以pythonic方式执行此操作?否则我必须做:
>>> AND(1,AND(0,1).output).output
0
问题来源:stackoverflow
调用返回的值(例如AND(1,0)`)无法同时是AND类的实例和数字0。您可以获取实例,也可以获取整数结果,但不能同时获取两者。
或两者都不完全相同。您可以构建您的类,以便在某些情况下实例的行为类似于整数。例如,如果添加一个int方法,则将该类传递给int()时,该类将可转换为整数。
其他一些类型甚至可以更轻松地转换为。如果期望所有的门都具有二进制输出值0
或1
,则可以通过在类上实现bool
方法来获得所需的值(自动评估)。Python在评估对象是否“真实”时使用此方法。因此,如果if AND(...)会像您期望的那样进行评估,那么
all([AND(...),AND(...)])(也会很方便地实现
AND `类)。
请注意,布尔值True和False分别等于整数1和0。bool类是int的子类!
这是我使用bool
(而不是output
)制作类的方法:
class Gate:
def __init__(self, \*rgs, \*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)
现在您可以执行诸如result = And(True,And(True,False,))之类的操作,然后将一个AND对象保存到result中。但是bool(result)
会给你False
的值。获取类的repr还将评估其布尔值(因此它可以在repr字符串中包含True或False结果)。
注意,我们不对输入进行任何形式的转换(没有int()调用)。这意味着代码可以与其他类型的输入值(例如基于从磁盘上的文件中读取内容或提示用户的输入)懒惰地工作:
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}>"
如果执行lazy_result = And(Input(“ A:”),Input(“ B:”))),则执行print(lazy_result)
或bool(lazy_result)
会提示用户输入整数值,并进行评估所需的输出。注意,由于all
中的短循环,如果在第一个提示符处输入0',它将不会要求第二个,因为它不需要知道B值即可得出
的值。还有`!(在某些情况下可能不希望如此,因此您可能需要用不会短路的东西来代替“全部”。)
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。