【问题标题】:Why does this produce the error message AttributeError: 'A' object has no attribute 'f'为什么这会产生错误消息 AttributeError: 'A' object has no attribute 'f'
【发布时间】:2020-01-11 22:35:11
【问题描述】:
class A:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def method(self):
        return A(self.x + 1, self.y + 1)

    def method2(self, f):
        if self.f().x > 3:
            return True

a = A(1, 2)
y = a.method2(a.method())
print(y)

错误发生在有

的那一行
if self.f().x > 3:

我不明白为什么它说它没有属性而不是方法。

【问题讨论】:

  • 因为方法一个属性。为什么你认为self.f()起作用?
  • 我写这段代码是为了帮助我理解 OOP。我认为它会起作用,因为 self.f() 将引用 self.method() 然后返回一个新类,我想访问这个类的“x”实例属性。
  • 不清楚你为什么这么想: 1. 访问A.f 会给你A 的属性,名称为f 的(见stackoverflow.com/q/2612610/3001761);或 2. a.method() 的值将是 "method"
  • 如果a.method()返回一个新类,为什么它的值会是“方法”?
  • 嗯,确切地说,所以...为什么 f 在那个方法中是一个值,意味着 self.f 是 self.method?!即使 self.f 确实神奇地使用了 f 的值,那也没有意义。你的期望在我看来完全不合理。

标签: python python-3.x


【解决方案1】:

我们来看看a.method2的电话。

  1. 您致电a.method()。这将返回 A 的新实例
  2. 这个新实例作为局部变量f传递给a.method2
  3. 然后您尝试调用a.f(通过self),但f 是一个实例

您不是在调用self.<some_function>,您是在说A 的一个实例具有一个也是A 实例的属性,但事实并非如此。它正在有效地做:

a.A(a.x+1, a.y+1).x

这会引发您的错误。是的,A 的实例具有属性x,但没有A 的实例具有与此新实例匹配的属性。目前尚不清楚您要完成什么。如果您尝试测试 new 实例上的属性值,您可以这样做:

class A:
    def __init__(self, x
        self.y = y

    def method(self):
        return A(self.x + 1, self.y + 1)

    def method2(self):
        # just check the value itself
        if self.x > 3:
            return True
        else:
            return False

a = A(1, 2)

# b is a new instance, you shouldn't be testing values of b
# via some function in a, because really this function
# exists in all instances, including b
b = a.method()

# so check b.x through the instance b instead
b.method2()
False

【讨论】:

  • 感谢您抽出宝贵的时间来回答这个问题,堆栈溢出对于新程序员来说可能是非常苛刻的......我想基本问题不应该在这里继续
  • 这里有很多基本问题。有时,问题看起来像是在问一件事,而实际上问题的根源在于程序的实际目标是什么。这就是为什么会有很多你想做什么问题。我们都从某个地方开始,我们都创建了自己的意大利面条代码球。我记得我在这里提出的第一个问题,这就是我如何了解到向互联网寻求帮助可能会有点不和谐。不断进步,不断学习,不惧怕基础问题。通常有人以前问过他们。快乐编码:)
【解决方案2】:

问题仅仅在于混合“自我”。和“f()”。 method() 返回并且 method2() 应该期望的是一个类对象,所以你只需要完全按照它使用它。

这样完美运行:

class A:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def method(self):
        return A(self.x + 1,  self.y + 1)

    def method2(self, f):
        return f.x > 3

a = A(1, 2)
y = a.method2(a.method())
print(y)

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 2019-06-05
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多