为什么我在类上得到一个AttributeError,即使我定义了一个具有该名称的方法?

时间:2015-03-02 13:37:09

标签: python class python-2.7 methods attributeerror

我正在进行“面向对象编程的介绍”课程,我正在阅读Think Python的第17章。以下代码让我很难过。我继续得到“AttributeError:'时间'对象在运行时没有属性'print_time'”而且我很难找到它。有人可以帮助打破我做错的事情并帮助我解释一下吗?

class Time(object):
    """represents the time of day.  attributes: hour, minute, second"""

def print_time(time):
    print '%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second)

start = Time()

start.hour = 9
start.minute = 45
start.second = 00

print_time(start)

class Time(object):
    def print_time(time):
        print '%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second)

start.print_time()

我读到这是一个缩进错误,但我有IDLE设置警告我冲突并检查了两次无效。

2 个答案:

答案 0 :(得分:2)

让我们在(咳嗽)时间通过你的代码迈出一步。

class Time(object):
    """represents the time of day.  attributes: hour, minute, second"""

在此,您要定义class Time。它有docstring,但没有方法或其他属性。

def print_time(time):
    print '%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second)

这是function,与您之前定义的Time类完全分开,后者接受参数time并尝试使用time&#39打印字符串; s hourminutesecond属性。如果time没有所有这些属性,那么您将收到错误。

start = Time()

这将创建一个名为Time的{​​{1}}对象。

start

这些行将start.hour = 9 start.minute = 45 start.second = 00 hourminute属性添加到second

start

print_time(start) 为参数调用print_time,产生输出:

start

到目前为止一切顺利。现在......

09:45:00

这会创建一个 new 类,该类恰好也称为class Time(object): def print_time(time): print '%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second) 。它这次没有文档字符串,但它有method名为Time(与之前定义的print_time 函数完全分开,虽然它有相同的名称和代码)。

此时要意识到,仅仅因为您创建了一个名为print_time的新课程,根本没有任何影响使用先前定义的类创建的对象。它们仍然是您定义的原始 Time类的实例。使用内置Time函数来证明这一点很容易:

help

请注意,>>> help(start) Help on Time in module __main__ object: class Time(__builtin__.object) | represents the time of day. attributes: hour, minute, second | | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) start.print_time() 显示原始help类的文档字符串,但不显示新版本的方法。

Time

...而这会显示新>>> help(Time) Help on class Time in module __main__: class Time(__builtin__.object) | Methods defined here: | | print_time(time) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) 类中的print_time方法,但不会显示原始文档中的文档字符串。

想到这一点的一种方法是,一个班级就像一个制造物品的工厂 - 拆掉福特工厂然后在同一个地方建造一个新工厂并不会对这个工厂造成任何影响。 71野马已经坐在你的车道上了。

如果您想要 Time课程的实例,则必须创建它:

Time

......然后,一旦它具有正确的属性......

>>> restart = Time()

...您可以成功调用其>>> restart.hour = 9 >>> restart.minute = 45 >>> restart.second = 00 方法:

print_time

答案 1 :(得分:0)

我不做Python,但我会从好的错误消息中猜测你试图调用一个对象类型不存在的方法。

这一行(最后):

start.print_time()

应该用这样的东西代替:

print_time(start)