【问题标题】:calling a function from class in python - different way从python中的类调用函数 - 不同的方式
【发布时间】:2011-11-01 10:24:20
【问题描述】:

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 个)”

【问题讨论】:

    标签: python oop class methods


    【解决方案1】:

    你必须使用 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)
    

    【讨论】:

    • 那么@staticmethod标签会自动放入self参数吗?
    • 如果您使用@staticmethod,您可以使用该类而无需先声明一个变量,例如,在这种情况下,如果您尝试使用 MathOperation.testAddtion(2,3) 它会给您一个错误“TypeError : 未绑定方法"
    • 不,staticmethod 装饰器不需要 self 参数。
    【解决方案2】:

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

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

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

    简而言之:太复杂了,很多事情都在幕后发生。让我什至说,它是非 Python 的,因为有许多不同的方法可以实现相同的目标。

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

    好好阅读这些页面:

    你会发现它们非常有用。

    如果您真的想学习 OOP,我建议您从更传统的语言开始,例如 Java。它没有 Python 一半的乐趣,但更容易预测。

    【讨论】:

    • 不客气!顺便说一句,直接的答案是你得到了错误,因为解释器为绑定方法添加了一个self 参数,所以你最终得到了三个(self 加上你提供的两个整数)。
    • 啊!这种解释是有道理的。我通常对原始的 python 文档感到厌倦,因为它们对新手不友好,更喜欢使用“a byte of python”之类的网站。
    【解决方案3】:

    您的方法不引用对象(即 self),因此您应该 使用@staticmethod decorator:

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

    【讨论】:

    • 我正在编辑问题。你能解释一下那里的类型错误吗?我给出了两个论点,但它说的是 3 个论点。
    【解决方案4】:

    您需要有一个类的实例才能使用它的方法。或者,如果您不需要访问任何类的变量(不是静态参数),那么您可以将方法定义为静态,即使该类未实例化也可以使用它。只需将 @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

    【讨论】:

    • @RishavSharan 没问题,其他答案已经提到缺少的 self 参数。但如果您不需要使用类参数,我仍然会使用静态方法。
    【解决方案5】:
    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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多