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个)”
答案 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())