初学者遇到类的问题

0 投票
3 回答
1111 浏览
提问于 2025-04-15 21:07

我正在学习O'Reilly的《学习Python》,遇到了关于类的问题。我觉得我理解这个概念,但在实际操作中却碰到了麻烦。

在书的第88-89页上:

>>> class Worker:
def __innit__(self, name, pay):
    self.name=name
    self.pay=pay
    def lastName(self):
        return self.name.split()[-1]
    def giveRaise(self, percent):
        self.pay*=(1.0+percent)

然后书上说“像调用函数一样调用类会生成一个新类型的实例……等等”,并给出了这个例子。

bob = Worker('Bob Smith', 50000)

结果我遇到了这个错误:

TypeError: 这个构造函数不接受任何参数。

然后我开始咕哝一些脏话。那么我到底哪里出错了呢?

谢谢大家的帮助。

3 个回答

2

你写成了 __innit__,其实应该是 __init__

这样一来,你只是定义了一个普通的方法,而不是一个特殊的方法,也就是构造函数。构造函数的名字必须是 __init__。所以,Python会自动生成一个不带参数的默认构造函数,这就导致了错误信息的出现。

5

有一个拼写错误:应该是 __init__,而不是 __innit__ -- 就少了一个 n

你还有一些缩进的问题,不过我觉得这些可能是复制粘贴时出现的错误,要不然你在遇到 TypeError 之前就会看到 SyntaxError 了;-)。

所以你的代码应该是这样的:

class Worker(object):
    def __init__(self, name, pay):
        self.name=name
        self.pay=pay
    def lastName(self):
        return self.name.split()[-1]
    def giveRaise(self, percent):
        self.pay*=(1.0+percent)

我还在 class Worker 后面加上了 (object) -- 在 Python 3.* 中这没什么关系,但在 2.* 中是有区别的(即使在 3.* 中加上也没坏处;-)。这样做会让这个类变成“新风格”,虽然在最基础的层面上这没什么影响,但一旦你想做一些“酷炫有趣”的事情,比如添加属性时,就会变得很重要;-)。

8

大卫,你把 __init__ 写错了。

正确的写法是:

def __init__(self, name, pay):
    self.name=name
    self.pay=pay
def lastName(self):
    return self.name.split()[-1]
def giveRaise(self, percent):
    self.pay*=(1.0+percent)

撰写回答