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)
免责声明:这不是一个单一的答案,它更像是一条建议,即使答案可以在参考文献中找到
恕我直言:Python中的面向对象编程非常糟糕.
方法调度不是很简单,您需要了解绑定/未绑定的实例/类(和静态!)方法; 你可以有多个继承,需要处理遗产和新风格的课程(你的风格很旧),知道MRO是如何工作的,属性......
简而言之:太复杂了,引擎盖下发生了很多事情.我甚至可以说,它是单声道的,因为有许多不同的方法来实现相同的东西.
我的建议:只有当它非常有用时才使用OOP.通常这意味着编写实现众所周知的协议的类,并与系统的其余部分无缝集成.不要仅仅为了编写面向对象的代码而创建许多类.
好好阅读这个页面:
你会发现它们非常有用.
如果你真的想学习OOP,我建议从更传统的语言开始,比如Java.它不像Python那么有趣,但它更可预测.