作业要求在self.radius
讲师中设置一个即时变量Circle
,并等于传入的diameter
。然后为circumference
定义Circle
仅接受一个自变量self
的对象,并通过以下公式返回具有给定半径的圆的圆周:circumference = 2 * pi * radius
。然后打印出circumference
中medium_pizza
是diameter
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
答案 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.radius
和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
进行了初始化。因此,我可以执行以下操作:
toppings
现在我可以调用此披萨对象的方法来修改其属性或获取信息
radius
如果这没有意义,请告诉我,我可以添加更多信息。