仅使用静态方法将数学方法继承到类中

时间:2016-10-27 21:12:26

标签: python python-2.7

我需要定义一个扩展 python的标准数学模块的类,而不实例化它(不需要,类中的所有方法都是静态的):

import math

class more_math(math):

    @staticmethod
    def add_func(x):
        return math.sqrt(x)+1

上面的代码无法正常运行(脚本退出),错误:

TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

当上面的类声明设置为class more_math:时,会调用more_math.add_func(x)而不会出错。但是,more_math.sqrt(x) [sqrt是无法调用math]的方法,因为more_math没有math作为其基类。< / p>

关于如何正确设置的想法?

3 个答案:

答案 0 :(得分:2)

想想你是否真的需要提供数学工具的功能。你几乎肯定不会;你可能只需要提供你的额外内容。也就是说,如果您确实需要提供一个实现所有标准数学函数的more_math模块,最简单的方法是执行from math import *。这将使math模块定义的每个函数都进入您的模块。这被认为是非常错误的做法,因为它污染了模块的命名空间,并且很难说出实际使用的是什么。但是,在这种情况下,模块名称空间的污染正是您想要的

答案 1 :(得分:0)

由于@ user2357112评论数学是一个模块,而不是一个类。您只需创建一个带有以下内容的more_math.py文件即可创建 more_math 模块:

from math import *

def add_func(x):
    return sqrt(x)+1

可以使用import more_mathfrom more_math import add_func导入此模块。

答案 2 :(得分:0)

math不是一个类,它是类types.ModuleType实例。您可以使用isinstance(math, types.ModuleType)验证这一点,该True将返回more_math.py。通常,您无法定义从另一个类的实例继承的子类。但是, 可能有点hackery (我从ActiveState网站上inheriting from an instances的食谱中得到了这个想法。)

由于它是一个黑客,人们可能不想在生产代码中使用它。但是我认为你(以及其他读者)可能会发现它最不有趣,如果没有用的话。

脚本from copy import deepcopy import math import sys def class_from_instance(instance): copy = deepcopy(instance.__dict__) def __init__(self, *args, **kwargs): super(InstanceFactory, self).__init__(*args, **kwargs) self.__dict__.update(copy) InstanceFactory = type('InstanceFactory', (instance.__class__,), {'__init__': __init__}) return InstanceFactory class MoreMathModule(class_from_instance(math)): @staticmethod def added_func(x): return math.sqrt(x)+1 # Replace this module with an instance of the class above. ref, sys.modules[__name__] = sys.modules[__name__], MoreMathModule('more_math') if __name__ == '__main__': import more_math x = 42 print('more_math.sqrt({}) -> {:.6f}'.format(x, more_math.sqrt(x))) print('more_math.added_func({}) -> {:.6f}'.format(x, more_math.added_func(x)))

more_math.sqrt(42) -> 6.480741
more_math.added_func(42) -> 7.480741

输出:

{{1}}