为什么Circle.circumference返回错误?并需要添加()使其起作用?

时间:2019-03-22 03:18:34

标签: python-3.x

作业要求在self.radius讲师中设置一个即时变量Circle,并等于传入的diameter。然后为circumference定义Circle仅接受一个自变量self的对象,并通过以下公式返回具有给定半径的圆的圆周:circumference = 2 * pi * radius。然后打印出circumferencemedium_pizzadiameter

12中的<bound method Circle.circumference of <__main__.Circle object at 0x7f75b5bfc588>>

我写了下面的代码。但是当我运行代码时,它给了我这个错误print(medium_pizza.circumference())

我后来通过radius(添加())更改了代码,并且可以正常工作,但是我无法解决。为什么()的结果如果没有circumference就可以打印出来,而def __init__却不能。

我确实还有另一个问题,我真的希望有人可以帮助我。由于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) 才能获得半径结果。

iot:GetThingShadow

1 个答案:

答案 0 :(得分:1)

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

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

是一种方法,其中您已将self.circumference定义为属性,但是Circle.circumference仍然是方法,因为您定义的属性不会覆盖该值,因此{{1} }放在“错误”中,但这并不是错误,因为python实际上确实为您提供了您想要的东西,这是指向定义为bound method的方法的指针,如果要重新定义,这将非常有用函数名称,稍后再说,例如circumference会将my_new_func = medium_pizza.circumference绑定到my_new_fun的圆周方法,然后可以使用medium_pizza而不是{{1 }},因为它们现在都指向相同的方法。

如果您不明白这一点,那没关系,我认为您的作业无论如何都不要求您了解这一点,但是值得注意。重要的是my_new_func()是一个方法名称,因此除非您使用medium_pizza.circumference()来调用该方法,否则它会返回一个方法地址。

对于问题的第二部分,medium_pizza.circumference实际上具有返回类型,它是medium_pizza.circumference(),它是一个圆

您不必返回__init__(self):的原因是因为您已将radius分配为该类的属性,python的属性有所不同,因此可能会有些混乱,但这就是您的方式做吧。

类与函数不同,要了解有关如何使用类的更多信息,请参阅python文档,它非常好here。不过,从您的角度来看,我建议您看看here instead,这会更直接一些。

以此为例,

假设我有一堂课

self

有点复杂,但不是真的

我定义了一个具有直径的披萨类,并使用两个属性self.radiusclass 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 进行了初始化。因此,我可以执行以下操作:

toppings

现在我可以调用此披萨对象的方法来修改其属性或获取信息

radius

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