【问题标题】:In the following code why does the last line of execution give an error?在下面的代码中,为什么最后一行执行会报错?
【发布时间】:2014-12-16 07:59:18
【问题描述】:

在下面的代码中,为什么执行的最后一行会报错? x.bf() 中的点运算符不应该将实例 'x' 传递给函数 bf 吗(就像 x.af() 一样)?

class A:
    a = 6
    def af (self):
        return "Hello-People"

class B:
    b = 7
    def bf (self):
        return "Bye-People"

>>> x = A()
>>> b = B()
>>> x.bf = B.bf
>>> x.bf()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bf() missing 1 required positional argument: 'self'

【问题讨论】:

    标签: class oop instance python-3.4


    【解决方案1】:

    x.bf = B.bf 是你的错误,因为 B 是一个类,而不是对象的实例。

    您不能将 x.bf 直接分配给该类。 您需要将 x.bf 分配给实例 'b.bf' 或正确实例化该类

    即。要么将该行更改为:

    # Where we instantiated class B and invoke bf via lazy loading (loading at the last possible minute)
    x.bf = B().bf 
    

    # Use the existing instance of B and call bf
    x.bf = b.bf
    

    更多信息:

    1. A 和 B 是您的课程。在您实例化它们之前,它们不会做任何事情。
    2. x 和 b 是您的对象实例。 x 是 A 的实例,b 是 B 的实例
    3. 当你实例化一个类时,你需要遵守它的构造函数签名。在这种情况下,这些类除了 self 之外不需要额外的参数。但是,只有通过 () 调用该类时,才会传递 self;

      'x = A()' 和 'b = B()' 符合那个签名

      你遇到的错误基本上是python告诉你你调用了一些东西,一个函数或一个类,而没有传入一个必需的变量。

    【讨论】:

    • 能否更详细地解释一下为什么会发生这种情况。
    • 但是在最后一行x.bf()中,x是一个实例变量。那么它不应该将 self 传递给 bf 吗?
    • 正确。最后一行可以写成 x.bf 或 x.bf()。我选择将其保留为 x.bf(),因为个人偏好是始终调用一个函数并表明它的函数签名正在被实现。 x.bf() 告诉我我正在对象 x 上调用 bf(),它不需要额外的参数。
    • 好的。我有点困惑。 B.bf 绑定到 x.bf 什么(在倒数第二行)?如果是 B 中 bf 的函数定义,那么它不会将 x 作为 self 参数传递给 x.bf(),从而不会报错吗?
    • x.bf 没有任何内容。 x.bf 只是对象 x 上的一个变量。语句“x.bf = B().bf”或“x.bf() = b.bf”基本上告诉python将B().bf或b.bf的返回值分配给x.bf .那有意义吗?你原来的错误被抛出,因为你不能调用 B.bf。您需要实例化 B(),然后调用 bf,因此解决方案 B().bf。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2017-03-26
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多