为什么错误消息是“列表对象没有属性*()”,而不是“列表对象没有方法*()”?

时间:2017-10-31 17:22:27

标签: python python-3.x

全部。我知道当你调用一个不属于那个对象的方法时,你会得到一个错误,说“列表对象没有那个属性”。我的问题是:为什么人们在这里使用属性,而不是使用方法?我的意思是,确切地说,它应该是方法,对吗?谢谢你们。

4 个答案:

答案 0 :(得分:4)

在像

这样的操作中
some_list.foo()

您正在考虑将两个步骤作为一个步骤。检索属性:

some_list.foo

并称之为:

             ()

与其他一些语言不同,这些是完全独立的步骤。负责some_list.foo属性访问的代码不知道您计划调用该属性。它只是看到你试图检索一个不存在的属性,这就是它告诉你的。

答案 1 :(得分:0)

方法属性,特别是可调用属性。属性是一个更通用的术语,包括作用于对象的任何内容。例如:

class Example(object):
    def __init__(self):
        self.some_attr = True

    def some_method(self):
        return False

foo = Example()
foo.some_attr    # is an attribute of foo of type boolean
foo.some_method  # is an attribute of foo of type method

答案 2 :(得分:0)

因为在Python中一般没有方法(方法只是附加到类的函数)。典型的调用如下所示:

x.foo (bar)

但这与此完全相同:

m = x.foo
m (bar)

错误发生在第一步,很明显,此时foo只是一个属性,属性getter不知道以后会用它做什么。

答案 3 :(得分:0)

考虑以下代码:

class A:

    def foo():
        return "a"

a = A()
a.bar()

调用a.bar()时,Python生成以下ast(抽象语法树):

Call(
    func=Attribute(
        value=Name(id='a', ctx=Load()),
        attr='bar',
        ctx=Load()
    ),
    # ...
)

Python尝试做的第一件事是获取属性,并检查它是否可调用。如果该属性不存在,Attribute将首先失败,从而导致其相关错误A object has no attribute bar

请注意,它并没有说A object has no attribute bar()