首页 > 解决方案 > 为什么 Circle.circumference 返回错误?并且需要添加 () 才能使其工作?

问题描述

该任务要求self.radiusCircle讲师中设置一个即时变量,并等于diameter传入的那个。然后为只接受一个参数circumference的对象定义,并通过以下公式返回具有给定半径的圆的周长:。然后打印出来是Circleselfcircumference = 2 * pi * radiuscircumferencemedium_pizzadiameter12

我写了下面的代码。但是当我运行代码时,它给了我这个错误<bound method Circle.circumference of <__main__.Circle object at 0x7f75b5bfc588>>

后来我确实通过(添加一个())更改了我的代码print(medium_pizza.circumference())并且它可以工作,但我无法围绕它来思考。为什么radius结果可以在没有 的情况下打印出来(),但circumference不能。

我确实有另一个问题,我真的希望有人能帮助我。既然def __init__return none,为什么我仍然可以得到radius结果。我想我必须写return self.radius才能得到半径结果。

class Circle:
  pi = 3.14
  def __init__(self, diameter):
    print("Creating circle with diameter {d}".format(d=diameter))
    # Add assignment for self.radius here:
    self.radius = diameter / 2
  def circumference(self):
    self.circumference= 2 * self.pi * self.radius
    return self.circumference

medium_pizza = Circle(12)
print(medium_pizza.circumference)
print(medium_pizza.radius)

标签: python-3.x

解决方案


这是因为您将圆周定义为类中的方法,因此它会覆盖您在同一方法中定义的属性。基本上:

def circumference(self):
    self.circumference = 2 * self.pi * self.radius
    return self.circumference

是一种方法,您已将其定义self.circumference为属性,但Circle.circumference仍然是一种方法,因为您定义的属性不会覆盖该值,因此bound method“错误”中的部分,但这不是错误,因为 python实际上是给你你想要的,它是一个指向定义为的方法的指针,circumference如果你想稍后将函数的名称重新定义为其他东西,这很有用,比如my_new_func = medium_pizza.circumferencethis 绑定my_new_funmedium_pizza的圆周方法,然后你可以调用 usingmy_new_func()而不是medium_pizza.circumference()因为它们现在都指向同一个方法。

如果你不明白那也没关系,我认为你的任务无论如何都没有要求你理解这一点,但值得注意的是。重要的是它medium_pizza.circumference是一个方法名,所以它返回一个方法地址,除非你使用medium_pizza.circumference()which 调用该方法。

至于你问题的第二部分,__init__(self):实际上确实有一个返回类型,它是self,它是一个 Circle

您不必返回的原因self.radius是因为您已将半径指定为类的属性,python 的属性略有不同,因此可能有点令人困惑,但这就是您的做法。

类不同于函数,要了解更多关于如何使用类的信息,请查看 python 文档,这里很不错。虽然,在你的水平上,我建议你看看这里,它更简单一些。

有了这个,让我们做一个例子:

假设我有一堂课

class pizza():
    pi = 3.14
    def __init__(self, diameter):
        self.toppings = []
        self.radius = diameter / 2
    def cirumference(self):
        return 2 * self.pi * self.radius
    def add_topping(self, topping):
        self.toppings.append(topping)
    def get_top_topping(self):
        return self.toppings[0] if len(self.toppings) > 0 else None

有点复杂,但不是真的

我定义了一个披萨类,它采用直径,并使用两个属性toppingsradius. 所以我可以做到以下几点:

my_pizza = pizza(12)
print(my_pizza.radius)  # Will print out 6
print(my_pizza.toppings)  # Will print out []

现在我可以调用这个比萨对象的方法来修改它的属性,或者获取信息

print(my_pizza.circumference())  # Will print 2pi*radius <- Note this is a method
my_pizza.add_topping("anchovies")  # Adds "anchovies" to the toppings list
print(my_pizza.toppings)  # Will print ["anchovies"] <- Note this is a property
print(my_pizza.get_top_topping())  # Will print "anchovies"

如果这没有意义,请告诉我,我可以添加更多信息。


推荐阅读