开发者社区> 问答> 正文

获取实例以默认评估

我有以下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

展开
收起
is大龙 2020-03-24 14:21:03 426 0
1 条回答
写回答
取消 提交回答
  • 调用返回的值(例如AND(1,0)`)无法同时是AND类的实例和数字0。您可以获取实例,也可以获取整数结果,但不能同时获取两者。

    或两者都不完全相同。您可以构建您的类,以便在某些情况下实例的行为类似于整数。例如,如果添加一个int方法,则将该类传递给int()时,该类将可转换为整数。

    其他一些类型甚至可以更轻松地转换为。如果期望所有的门都具有二进制输出值01,则可以通过在类上实现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

    2020-03-24 14:21:11
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《用管控策略设定多账号组织全局访问边界》 立即下载
运用新技术解决有状态应用的冷热迁移挑战 迁移策略+新容器运行时 立即下载
《Pulsar 2.8.0 功能特性概述及规划》 立即下载