__init__()缺少1个必需的位置参数。

42

我正在尝试学习Python。这是一个非常简单的代码。我在这里所做的一切就是调用一个类的构造函数,在那里初始化一些变量并打印该变量,但它给了我一个错误,缺少1个必需的位置参数

class DHT:
    def __init__(self, data):
        self.data['one'] = '1'
        self.data['two'] = '2'
        self.data['three'] = '3'
    def showData(self):
        print(self.data)
        
if __name__ == '__main__':
    DHT().showData()
6个回答

27
你收到此错误是因为您没有将 data 变量传递给 DHT 构造函数。 aIKidAlexander 的答案很好,但不起作用,因为您仍然必须像这样在类构造函数中初始化 self.data
class DHT:
    def __init__(self, data=None):
        self.data = data if data is not None else {}
        self.data['one'] = '1'
        self.data['two'] = '2'
        self.data['three'] = '3'

    def showData(self):
        print(self.data)

然后像这样调用方法showData

DHT().showData()

或者像这样:

DHT({'six':6,'seven':'7'}).showData()

或者像这样:

# Build the class first
dht = DHT({'six':6,'seven':'7'})
# The call whatever method you want (In our case only 1 method available)
dht.showData()

11
请注意,该解决方案存在以下潜在问题:d1 = DHT(); d2 = DHT(); d1.data['four'] = '4'; d2.showData()显示了带有数字 4 的条目。换句话说,未指定 data 的后续构造函数调用将获得相同的字典。为了解决这个问题,通常会在 def 行上指定 data=None,然后在过程的第一条语句中检查 data 是否为 None,如果是,则将其替换为一个新的字典。 - Erik P.
以这种方式调用构造函数有什么问题吗? - Mugen
1
使用明确的if-else块来检查"data"是否为"None",可以避免使用另一种语句"self.data = data or {}"时出现问题,后者会在将除"None"以外的任何非真对象传递给构造函数时分配一个空字典。例如,“False”,“0”,“”“”,“[]”,“()”,“{}”,指定“nonzero()”的对象都会计算为“False”,因此使用“self.data = data or {}”并传递这种虚假的对象仍然会创建一个空字典。这可能是所期望的效果,但保持显式通常会使调试更容易,因此通常更喜欢使用if-else块。 - Kyle F Hartzenberg

5

你的构造函数需要一个参数(data),但是你在调用时没有传递它。我猜你想要初始化对象中的一个字段。那么代码应该像这样:

class DHT:
    def __init__(self):
        self.data = {}
        self.data['one'] = '1'
        self.data['two'] = '2'
        self.data['three'] = '3'
    def showData(self):
        print(self.data)

if __name__ == '__main__':
    DHT().showData()

甚至只是这样:
class DHT:
    def __init__(self):
        self.data = {'one': '1', 'two': '2', 'three': '3'}
    def showData(self):
        print(self.data)

1
非常感谢,它正在运行。对于提出这样愚蠢的问题,我很抱歉。 - odbhut.shei.chhele

2
你应该将data可能作为一个关键字参数,并设置默认值为空字典。
class DHT:
    def __init__(self, data=None):
        data = data if data is not None else {}
        self.data['one'] = '1'
        self.data['two'] = '2'
        self.data['three'] = '3'
    def showData(self):
        print(self.data)

if __name__ == '__main__': 
    DHT().showData()

1
不要使用可变默认参数! 相反,将None作为默认值,然后在函数内部创建字典,就像Michael的答案中所示。 - wjandrea

0

问题出在你身上

def __init__(self, data):

当你从DHT类创建对象时,应该传递参数,数据应该是字典类型,例如:
data={'one':1,'two':2,'three':3}
dhtObj=DHT(data)

但是在你的代码中,你应该改变的是

data={'one':1,'two':2,'three':3}
if __name__ == '__main__': DHT(data).showData()

或者

if __name__ == '__main__': DHT({'one':1,'two':2,'three':3}).showData()

0

你需要将一些数据传递给它。例如一个空字典。

if __name__ == '__main__':
    DHT('a').showData()

然而,在你的例子中根本不需要参数。你可以简单地声明它:
def __init__(self):

也许你的意思是从数据中设置它?

class DHT:
    def __init__(self, data):
        self.data['one'] = data['one']
        self.data['two'] = data['two']
        self.data['three'] = data['three']
    def showData(self):
        print(self.data)

if __name__ == '__main__':
    DHT({'one':2, 'two':4, 'three':5}).showData()

showData 会打印您刚刚输入的数据。


非常感谢,它正在运行。对于提出这样愚蠢的问题,我很抱歉。 - odbhut.shei.chhele
1
完全没有问题!如果有人能从我这里学到东西,我已经很开心了。 - aIKid

0
如果出现错误,就像这样:
    Author=models.ForeignKey(User, related_names='blog_posts') 
TypeError:__init__()  missing 1 required positional argument:'on_delete'

那么解决方案就是,您需要添加一个参数

Author=models.ForeignKey(User, related_names='blog_posts', on_delete=models.DO_NOTHING)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接