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

Ris*_*ran 10 python oop methods class

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)
Run Code Online (Sandbox Code Playgroud)

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

from testClass import MathsOperations

xyz = MathsOperations(2, 3)
print xyz.testAddition()
Run Code Online (Sandbox Code Playgroud)

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

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

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

    def testMultiplication (a, b):
        return a * b
Run Code Online (Sandbox Code Playgroud)

称之为使用;

from testClass import MathsOperations
xyz = MathsOperations()
print xyz.testAddition(2, 3)
Run Code Online (Sandbox Code Playgroud)

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

我得到的错误是"TypeError:testAddition()正好接受2个参数(给定3个)"

Raf*_*lok 18

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

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

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

    def testMultiplication (self,a, b):
        return a * b
Run Code Online (Sandbox Code Playgroud)

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

tmp = MathOperations
print tmp.testAddition(2,3)
Run Code Online (Sandbox Code Playgroud)

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

print MathOperation.testAddtion(2,3)
Run Code Online (Sandbox Code Playgroud)

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

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

例如:

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

    @staticmethod
    def testMultiplication (a, b):
        return a * b
Run Code Online (Sandbox Code Playgroud)

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

print MathsOperations.testAddition(2,3)
Run Code Online (Sandbox Code Playgroud)

  • 不,staticmethod装饰器不需要self参数. (2认同)

for*_*ran 9

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

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

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

简而言之:太复杂了,引擎盖下发生了很多事情.我甚至可以说,它是单声道的,因为有许多不同的方法来实现相同的东西.

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

好好阅读这个页面:

你会发现它们非常有用.

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