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