2011-11-01 52 views
8

编辑2:谢谢大家的帮助!编辑:关于添加@staticmethod,它的工作原理。不过,我仍然想知道为什么我在这里得到一个类型错误。从python的类调用函数 - 不同的方式

我刚刚开始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中发生了什么错误吗?我如何使用这个课程?

错误我得到的是“类型错误:testAddition()到底需要2个参数(3给出)”

回答

14

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

在第二种情况下,您应该使用

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) 

它给你一个错误“类型错误:未绑定方法”

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

例如:

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

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

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

print MathsOperations.testAddition(2,3) 
+0

@staticmethod标签也会自动放入自我参数中吗? –

+0

如果你使用@staticmethod你可以使用该类而不首先声明一个变量,例如,在这种情况下,如果你尝试使用MathOperation.testAddtion(2,3),它会给你一个错误“TypeError:unbound method” –

+2

不, staticmethod装饰器不需要自我参数。 –

1

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

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

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

+0

我编辑了一下这个问题。对此感到遗憾。 –

+0

@RishavSharan没问题,其他答案已经提到了缺失的“自我”论点。但是如果你不需要使用类参数,我仍然会使用静态方法。 – rplnt

2

你的方法不引用一个对象(即自我),所以你应该 使用@staticmethod decorator

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

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

我在编辑这个问题。你能解释那里的类型错误吗?我给出了两个论点,但它说3个论点。 –

7

免责声明:这不是一个只是给点答案,它更像一个忠告,即使回答可以在参考文献中找到

恕我直言:在Python中面向对象编程吸收了很多。

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

简而言之:太复杂了,有很多东西在罩下发生。我甚至可以说,它是和谐的,因为有许多不同的方式来实现同样的事情。

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

以一个良好的阅读此页:

,你会发现它们非常有用。

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

+0

谢谢。我会检查页面。 –

+0

不客气!顺便说一句,直接的答案是,你得到的错误是因为解释器为绑定方法添加了一个“self”参数,所以你最终得到三个(“self”加上你提供的两个整数)。 – fortran

+0

啊!这个解释是有道理的。 我通常对原始python文档感到厌倦,因为它们不是新手友好的,宁愿使用像“一个python字节”这样的网站。 –