这里的问题非常简单,但我是 python 作为一种面向对象的编程语言的新手。我正在尝试写一个类。想象一下它的组织如下:
class myClass:
def __init__(self,a,b,runit=True):
self.a = a
self.b = b
if runit:
self.run_func()
def run_func(self):
self.c = self.a*self.b
return
如您所见,该类仅使用 a
和 b
进行了初始化。它默认从这些参数初始化 c
,但它不需要。现在让我来说明三个我认为应该表现相同但实际上不同的用例:
# Use 1
test = myClass(5,2)
print(test.c)
# Use 2
test = myClass(5,2,runit=False)
test.run_func()
print(test.c)
# Use 3
test = myClass(5,2,runit=False).run_func()
print(test.c)
这将返回以下内容:
10
10
Traceback (most recent call last):
File "<ipython-input-37-cb854baa3a0c>", line 23, in <module>
print(test.c)
AttributeError: 'NoneType' object has no attribute 'c'
为什么不能立即对实例化的类进行操作并将此结果一步传递给test
?在我看来,(1) 和 (2) 是同一组操作,只是一个分为两步,另一个在一行中完成。
而且,更重要的是,我如何通过编辑我的类使其以预期的方式运行来解决这个问题?
最佳答案
在 # Use 3
myClass(5,2,runit=False).run_func()
返回 None
修复你可以返回self
:
def run_func(self):
self.c = self.a*self.b
return self
test = myClass(5,2,runit=False).run_func()
print(test.c)
输出:
10
或者您不应该将标志 runit
设置为 False
并使用:
class myClass:
def __init__(self,a,b,runit=True):
self.a = a
self.b = b
if runit:
self.run_func()
def run_func(self):
self.c = self.a*self.b
test = myClass(5,2)
print(test.c)
输出:
10
https://stackoverflow.com/questions/60640075/
相关文章:
swift - 将核心数据同步到 CloudKit 公共(public)数据库
python - 如何在 asyncio create_task 中更新全局变量
javascript - YouTube 视频 API 片段标题包含 Next.js 中的特殊字符
session - Nuxt Apollo 具有用于基于 session 的身份验证的动态 head
javascript - 使用 JavaScript 检测按键持续时间
visual-studio-code - 有一种方法可以在 vscode 中的 ` `(重音符)内语
javascript - 使用javascript在数组中首先缺少正整数?