Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么会产生错误消息AttributeError:';A';对象没有属性';f';_Python_Python 3.x - Fatal编程技术网

Python 为什么会产生错误消息AttributeError:';A';对象没有属性';f';

Python 为什么会产生错误消息AttributeError:';A';对象没有属性';f';,python,python-3.x,Python,Python 3.x,错误发生在具有的行上 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 =

错误发生在具有的行上

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)

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

让我们来看看对
a.method2
的调用

  • 您可以调用
    a.method()
    。这将返回
    a
  • 这个新实例作为局部变量
    f
  • 然后尝试调用
    a.f
    (通过
    self
    ),但
    f
    是一个实例
  • 您不是在调用
    self.
    ,而是试图说
    A
    的实例有一个属性,该属性也是
    A
    的实例,但事实并非如此。它有效地做到了:

    a.a(a.x+1,a.y+1).x
    
    这会引起你的错误。是的,
    A
    的实例具有属性
    x
    ,但是
    A
    的实例没有与此新实例匹配的属性。还不完全清楚你想要完成什么。如果尝试在新实例上测试属性的值,则可以执行以下操作:

    A类:
    定义初始化(self,x
    self.y=y
    def方法(自我):
    返回A(self.x+1,self.y+1)
    def方法2(自身):
    #只需检查值本身
    如果self.x>3:
    返回真值
    其他:
    返回错误
    a=a(1,2)
    #b是一个新实例,您不应该测试b的值
    #通过a中的某个函数,因为实际上这个函数
    #存在于所有实例中,包括b
    b=a.方法()
    #因此,请通过实例b检查b.x
    b、 方法2()
    错误的
    
    问题在于混合使用“self.”和“f()”。method()返回的和method2()应该是类对象,因此您只需使用它就可以了

    这样它就完美地工作了:

    if self.f().x > 3:
    

    因为方法是一个属性。为什么你认为
    self.f()
    会起作用?我写这段代码是为了帮助我理解OOP。我认为它会起作用,因为self.f()会引用self.method()然后返回一个新类,我想访问这个类的“x”实例属性。不清楚您为什么会这样想:1.访问
    a.f
    会给您一个名为f的属性(请参阅);或2.访问
    a.method()
    的值会是
    方法
    。为什么
    a.method()
    的值会是“方法"如果它返回一个新类?嗯,没错,那么…为什么该方法中的f是一个表示self.f是self.method的值?!即使self.f神奇地使用了f的值,那也没有意义。你的期望对我来说完全是不合理的。谢谢你花时间回答这个问题,堆栈溢出对新程序员来说可能会非常苛刻。。。我想基本问题不应该在这里继续。这里有很多基本问题。有时候,问题看起来像是在问一件事,而问题的真正根源是这个项目的实际目标是什么。这就是为什么有很多你想做什么的问题。我们都从某个地方开始了,我们都创造了自己的目标自己的意大利面代码球。我记得我在这里的第一个问题,这是我如何学会向互联网寻求帮助可能会有点刺耳。不断改进,不断学习,不要害怕基本的问题。通常以前有人问过。快乐编码:)
    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)