Python 这门课怎么样;s u调用u方法工作,当它';没有适当的论据就叫作什么?

Python 这门课怎么样;s u调用u方法工作,当它';没有适当的论据就叫作什么?,python,python-2.7,class,python-3.x,nolearn,Python,Python 2.7,Class,Python 3.x,Nolearn,我正在浏览Daniel Nouri关于使用CNN的面部识别的文章,我遇到了一些我不懂的代码。Daniel正在定义一个类,该类将在网络培训期间的每次迭代结束时调用,该类将决定培训是否应提前停止: class EarlyStopping(object): def __init__(self, patience=100): self.patience = patience self.best_valid = np.inf self.best_va

我正在浏览Daniel Nouri关于使用CNN的面部识别的文章,我遇到了一些我不懂的代码。Daniel正在定义一个类,该类将在网络培训期间的每次迭代结束时调用,该类将决定培训是否应提前停止:

class EarlyStopping(object):
    def __init__(self, patience=100):
        self.patience = patience
        self.best_valid = np.inf
        self.best_valid_epoch = 0
        self.best_weights = None

    def __call__(self, nn, train_history):
        current_valid = train_history[-1]['valid_loss']
        current_epoch = train_history[-1]['epoch']
        if current_valid < self.best_valid:
            self.best_valid = current_valid
            self.best_valid_epoch = current_epoch
            self.best_weights = nn.get_all_params_values()
        elif self.best_valid_epoch + self.patience < current_epoch:
            print("Early stopping.")
            print("Best valid loss was {:.6f} at epoch {}.".format(
                self.best_valid, self.best_valid_epoch))
            nn.load_params_from(self.best_weights)
            raise StopIteration()

显然,Daniel将类作为函数调用。但是,如果没有
\uuuu call\uuu(args)
中显示的参数,我不理解他是如何调用它的。nolearn的源代码就是这样实现的吗?我很困惑,网络是如何知道在没有传递到函数的情况下使用
nn
train\u历史记录的。

他没有调用
\u call_u
并没有调用
earlystup(耐心=200)
,而是调用*
earlystup.\u init\uu
签名:

def __init__(self, patience=100):
并为
耐心提供替代值;这与
\uuuu init\uuuu
的可用参数完全匹配

earlystoping.\uuuu call\uuuu
在实例上被调用;也就是说,如果调用顺序为:

e = EarlyStopping(patience = 200)
e(patience=50)  # TypeError Raised
将出现一个适当的错误



*让你感到困惑的括号实际上是在打电话。调用的不是
earlystoping.\uuuu-call\uuuu
,而是
type.\uuuuu-call\uuuu
,即
earlystoping
的(元)类<代码>类型。调用是Python在初始化对象时执行的第一个操作,它被调用时接受传递的任何参数,然后(在一些其他操作之后)按该顺序调用
\uuuuuuuu new\uuuuu
\uuuu init\uuuuu
;本质上,
\uuuuuu init\uuuuu
是通过
patience=100

的参数间接调用的,那么我是否应该假设初始化对象随后在NeuralNet的源代码中的某个地方被调用,并带有适当的参数?在我看来,实现这一功能似乎是一种奇怪的方式。为什么不直接传递一个函数呢?
e = EarlyStopping(patience = 200)
e(patience=50)  # TypeError Raised