python - 在 Python 类和对象中包含多个函数
问题描述
我对 Python 中的“类”和“对象”的概念非常陌生,我成功地使用以下方法定义了一个函数:
# build the object "test"
class test:
def __init__(self,raw_data):
self.method1 = raw_data*10
self.method2 = raw_data*20
self.method3 = raw_data*30
# a quick test using "raw_data = 1"
output = test(1)
# here three methods are all working
print(output.method1)
print(output.method2)
print(output.method3)
# outputs
10
20
30
但是在实际工作中,如何在这个“类”或“对象”的东西下包含很多功能/处理步骤。所以我可以一起运行它们。以下代码失败(只有第一个功能有效):
# build the object "test"
class test:
def __init__(self,raw_data):
self.method1 = raw_data*10
def compute_method_2(self,raw_data):
self.method2 = raw_data*20
def compute_method_3(self,raw_data):
self.method3 = raw_data*30
# a quick test using "raw_data = 1"
output = test(1)
# now only the first calculation worked
print(output.method1)
print(output.method2)
print(output.method3)
# Error report:
AttributeError: 'test' object has no attribute 'method2'
非常感谢您的帮助!
为了澄清我为什么要拆分功能:这只是一个简化的示例。在实际工作中,不同的处理步骤需要多个功能,这些功能适用于不同的项目。
解决方案
通常,Python 方法只有在您选择运行它们时才会运行。你被绊倒了,因为你第一次遇到方法是__init__()
,但这实际上是该规则的一个奇怪的例外:当你创建该类的每个对象时它会立即运行(这就是 的全部意义__init__()
)。因此,如果您希望它们运行,则需要手动运行这些方法:
# a quick test using "raw_data = 1"
output = test(1)
# run other computations
output.compute_method_2(1)
output.compute_method_3(1)
# now all the values are available
print(output.method1)
print(output.method2)
print(output.method3)
如果您希望在创建对象时运行这些方法,就像您在这里所做的那样,最好将代码放入__init__()
而不是每次创建对象时手动调用它们 - 请记住,这__init__()
就是存在的原因!但也许你__init__()
变得太大了,这就是你想把它分开的原因。在这种情况下,您仍然可以将代码放入方法中,但从中调用它们__init__()
(然后您不需要像上面的示例那样单独调用它们):
class test:
def __init__(self,raw_data):
self.method1 = raw_data*10
self.compute_method_2(raw_data)
self.compute_method_3(raw_data)
def compute_method_2(self,raw_data):
self.method2 = raw_data*20
def compute_method_3(self,raw_data):
self.method3 = raw_data*30
顺便说一句,“方法”是一个类的成员函数,就像你的compute_method_2()
函数(和__init__()
!)一样。数据成员不是方法,因此您使用self.method2
这些名称会令人困惑。
推荐阅读
- c# - 在 VPS 上执行某些命令后,带有 Hosting API 的控制台应用程序就会停止
- sql - postgresql split_part() 仅返回由分隔符分隔的唯一子字符串?
- jenkins - Jenkins 管道 - 从 bat 命令到标签的变量,输出显示完整的命令提示符
- javascript - iOS safari - 检查是否授予设备运动权限
- c# - 通过转换器与反序列化转换 Json 字符串
- python-3.x - django-taggit 在自定义标签上调用 names() 时出错
- vue.js - 使用 vue.js 的单一 spa 共享组件
- javascript - $load tab content from another page to my page仅显示前4张图片
- python - 如果值在使用 Python 的 dialogflow_v2 的数据库中,则将值从数据库传递到对话框流以避免提出必需的问题
- sorting - 有没有办法在 Google Data Studio 表中自定义排序记录?