在python中从类调用函数 - 以不同的方式

时间:2011-11-01 10:24:21

标签: python oop class methods

EDIT2:谢谢大家的帮助! 编辑:添加@staticmethod,它的工作原理。但是我仍然想知道为什么我在这里遇到类型错误。

我刚刚开始使用OOPS并且对它完全陌生。关于我可以从类中调用函数的不同方法,我有一个非常基本的问题。 我有一个testClass.py文件,代码为:

class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

我从另一个名为main.py的文件中调用此类,其代码如下:

from testClass import MathsOperations

xyz = MathsOperations(2, 3)
print xyz.testAddition()

这没有任何问题。但是,我想以更简单的方式使用该类。

我现在将以下代码放在testClass.py文件中。我这次放弃了init函数。

class MathsOperations:
    def testAddition (x, y):
        return x + y

    def testMultiplication (a, b):
        return a * b

使用;

调用此方法
from testClass import MathsOperations
xyz = MathsOperations()
print xyz.testAddition(2, 3)

这不起作用。有人可以解释案例2中发生的错误吗?我该如何使用这门课程?

我得到的错误是“TypeError:testAddition()只需要2个参数(给定3个)”

5 个答案:

答案 0 :(得分:18)

你必须使用self作为方法的第一个参数

在第二种情况下你应该使用

class MathOperations:
    def testAddition (self,x, y):
        return x + y

    def testMultiplication (self,a, b):
        return a * b

并在您的代码中,您可以执行以下操作

tmp = MathOperations
print tmp.testAddition(2,3)

如果您使用该类而不首先实例化变量

print MathOperation.testAddtion(2,3)

它会给你一个错误“TypeError:unbound method”

如果你想这样做,你将需要@staticmethod装饰者

例如:

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

然后在你的代码中你可以使用

print MathsOperations.testAddition(2,3)

答案 1 :(得分:8)

免责声明:这不是一个单一的答案,它更像是一条建议,即使答案可以在参考文献中找到

恕我直言:Python中的面向对象编程非常糟糕。

方法调度不是很简单,您需要了解绑定/未绑定的实例/类(和静态!)方法;你可以有多重继承,需要处理遗产和新风格的课程(你的风格很旧),并且知道MRO是如何工作的,属性......

简而言之:太复杂了,引擎盖下发生了很多事情。我甚至可以说,它是单声道的,因为有很多不同的方法可以达到同样的目的。

我的建议:只有当它真的有用时才使用OOP。通常这意味着编写实现众所周知的协议的类,并与系统的其余部分无缝集成。不要仅仅为了编写面向对象的代码而创建许多类。

请仔细阅读本页:

你会发现它们非常有用。

如果你真的想学习OOP,我建议从更传统的语言开始,比如Java。它不像Python那么有趣,但它更容易预测。

答案 2 :(得分:2)

你的方法不是指一个对象(也就是自己),所以你应该这样做 使用@staticmethod decorator

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

答案 3 :(得分:1)

您需要拥有一个类的实例才能使用其方法。或者,如果您不需要访问任何类的变量(不是静态参数),那么您可以将该方法定义为静态,即使未实例化该类也可以使用它。只需将@staticmethod装饰器添加到您的方法中即可。

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y
    @staticmethod
    def testMultiplication (a, b):
        return a * b

docs:http://docs.python.org/library/functions.html#staticmethod

答案 4 :(得分:0)

class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

然后

temp = MathsOperations()
print(temp.testAddition())