【问题标题】:Why doesn't this instance of this class's method take this argument?为什么这个类的方法实例不接受这个参数?
【发布时间】:2023-04-06 21:17:01
【问题描述】:

我的问题是为什么我不能创建一个类的对象给它一个整数作为参数。它完全忽略了我作为参数传递给它的值。然而,如果我从类中调用 area 函数并将相同的数字传递到它的括号中,它将输出所需的结果 144。

到目前为止,我的最佳猜测是类函数的编码方式与我希望它实现的目标不正确。我是否需要让 area 函数接受它的参数,例如:self.length

# -*- coding: utf-8 -*-
class square:
    sides = 4
    def __init__(self, length):
        self.length = length
    def area(self, length):
        return length * length

box = square(12)
print(box.area())

输出:TypeError: area() missing 1 required positional argument: 'length'

创建的对象不应该在对象生命周期内保存赋予它的值吗?如果调用看起来像这样,为什么当我告诉它第二次从 area 方法打印时它会引发另一个错误?

print(box.area(12))
output:144
print(box.area())
output: <bound method square_shape.area of <__main__.square_shape object at 0x7f5f88355b70>>

如果这个问题的措辞有点奇怪,我很抱歉,但我只是在寻找尽可能多的信息,并试图更好地了解我在这里所做的事情。关于这个主题的其他问题并没有很好地理解我想要弄清楚的内容。

【问题讨论】:

    标签: python function class python-3.x variables


    【解决方案1】:

    您正在考虑 self.length。长度(前面没有“自我”)只是一个局部变量。如果是参数,则需要提供。

    您可能想要的是: def area(self): return self.length * self.length

    【讨论】:

    • 所以如果我理解正确,那么长度是这个对象的局部变量,而我做某事的方式是以某种方式将其视为全局变量?
    • 也许吧?如果您正确地考虑它,那么您当前的术语是关闭的。长度是一个实例字段。还有一个长度局部变量。 “局部变量”指的是函数本身的局部范围。一旦 area 完成并返回一个值,则不再定义作为局部变量的“length”。不管 self.length 是什么,当你处理这个对象的这个特定实例时,实例字段都会保持它的值。
    • 您先生是个聪明人。您能否评论一下以 self 作为参数的函数实际上是如何导致这种巫术的?当它传递 self 时,它是否将在对象创建时传递的任何参数传递给 area 函数?
    • 将“self”参数作为每个类方法的第一个参数传入或多或少是一种约定。其余参数是您在其他代码中调用函数时使用的所谓“真实”参数。我还会对这个问题的另一个答案大喊大叫,说它与我的措辞不同,这可能会有所帮助。
    【解决方案2】:

    您的area 采用self 参数,足以访问self.length

    ...
    def area(self):
      return self.length * self.length
    

    然后您可以拨打square(3).area() 并获得9

    您当前的声明需要一个 显式 长度参数,例如 square(3).area(4) 会产生 16

    OOP 的一个关键原则是,方法 可以访问对象(或常说的实例)的状态,并且可以对该状态进行操作,而不是传递它明确地。

    在 Python 中,通常名为 self 的参数用于将有问题的对象传递给方法。 area 方法对squarelength 进行操作;您以self.length 访问它。 selfsquare 的一个实例,例如square(3) 返回。

    【讨论】:

      猜你喜欢
      • 2019-09-28
      • 2012-09-17
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多