gpt4 book ai didi

Python 覆盖 __init__

转载 作者:太空狗 更新时间:2023-10-29 17:58:30 27 4
gpt4 key购买 nike

我知道有很多人就此主题提出问题,但我还没有看到有人问过我的具体问题。子类化时,您可以像覆盖任何其他方法一样覆盖 __init__()。我的问题是为什么在下面的示例中这似乎无法正常工作:

import random
class MyRand(random.Random):
def __init__(self, myvar1, myvar2, x=None):
# ( ... my code ...)
super(MyRand, self).__init__(x)

请记住,Random 的构造函数具有以下签名:__init__(self, x=None) 其中 x 是可选种子。我想在我的子类中保留该功能,但我也想要求两个强制变量,myvar1myvar2

但是,当您尝试实例化(没有种子)时会出现错误:

MyRand('var1', 'var2')
TypeError: seed expected at most 1 arguments, got 2

这是因为 python 认为您需要 Random 的构造函数并将您的两个参数“var1”和“var2”作为种子传递。种子(从 Random 的构造函数内部调用)只需要 1 个参数,所以你会得到一个错误。

但是,如果你这样做

MyRand(myvar1='var1', myvar2='var2')

这行得通,这里 python 知道您将两个强制变量传递给它,而不是将可选种子传递给它。

但我认为第一种情况也应该有效。怎么回事?

最佳答案

在 Python 中,创建对象时会调用两个方法。 __new____init__。与用 C 实现的许多类一样,random.Random 使用 __new__ 来初始化自身(参见 random_new)。您必须覆盖它并使用适当的参数调用它:

import random

class MyRand(random.Random):
def __new__(cls, myvar1, myvar2, x=None):
return random.Random.__new__(cls, x)

def __init__(self, myvar1, myvar2, x=None):
# ( ... my code ...)

关于Python 覆盖 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41491884/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com