我需要定义一个扩展 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>
关于如何正确设置的想法?
答案 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_math
或from 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}}