Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取一个实例以在默认情况下对其求值_Python_Python 3.x - Fatal编程技术网

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
调用)。@David542
bool(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}>"