首页 > 解决方案 > 在 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'

非常感谢您的帮助!

为了澄清我为什么要拆分功能:这只是一个简化的示例。在实际工作中,不同的处理步骤需要多个功能,这些功能适用于不同的项目。

标签: pythonpython-3.x

解决方案


通常,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这些名称会令人困惑。


推荐阅读