python-3.x - 为什么 Circle.circumference 返回错误?并且需要添加 () 才能使其工作?
问题描述
该任务要求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__
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)
解决方案
这是因为您将圆周定义为类中的方法,因此它会覆盖您在同一方法中定义的属性。基本上:
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.circumference
this 绑定my_new_fun
到medium_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
有点复杂,但不是真的
我定义了一个披萨类,它采用直径,并使用两个属性toppings
和radius
. 所以我可以做到以下几点:
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"
如果这没有意义,请告诉我,我可以添加更多信息。
推荐阅读
- arrays - 根据列中的公共字符串合并两个文件,并填写不匹配的缺失值
- apache-nifi - 如何更新断开连接的 NiFi-Registry?
- html - 在 react.js(next.js) 中未应用 css 比例
- javascript - 有没有办法判断 POST(正文)请求是格式化为 URL 编码的查询字符串还是 JSON 数据?
- python - Pandas:按最大值分组并在组上求和的最快方法
- jquery - 每次 ajax 调用都会下载图像
- ruby - rbenv ruby 2.7.2 安装失败:“BUILD FAILED”
- reactjs - 如何在 MaterialUI 中设置 TextField 的样式
- python-3.x - 使用 databricks-connect 安装时在本地使用 Pyspark
- python - Python - 来自已解析 API 数据的数学运算