lambda
これは、あなたが望むことを実行できるシンプルな(しかし長い)ワンライナーです(部分的にBakuriuに触発されました)。
classify = lambda module: type(module.__name__, (), {key: staticmethod(value) if callable(value) else value for key, value in ((name, getattr(module, name)) for name in dir(module))})
次の関数の方が読みやすく、内包表記でループが見やすいかもしれません。
def classify(module):
return type(module.__name__, (),
{key: staticmethod(value) if callable(value) else value
for key, value in ((name, getattr(module, name))
for name in dir(module))})
使い方はバクリウさんの回答とほぼ同じで、通訳の方に話しかけてみるとわかります。
>>> import math
>>> MathClass = classify(math)
>>> MathClass.sin(5)
-0.9589242746631385
>>> instance = MathClass()
>>> instance.sin(5)
-0.9589242746631385
>>> math.sin(5)
-0.9589242746631385
>>>
補遺:
モジュールをクラスに変換する使用方法の 1 つを認識した後、変換されたモジュールを基底クラスとして使用する方法を示す次のサンプル プログラムが作成されました。このパターンは一般的な使用にはお勧めできないかもしれませんが、この概念の興味深い応用例を示しています。関数は、classify
以下に示すバージョンでも読みやすくなっているはずです。
import math
def main():
print(Point(1, 1) + Point.polar(45, Point.sqrt(2)))
def classify(module):
return type(module.__name__, (), {
key: staticmethod(value) if callable(value) else value
for key, value in vars(module).items()
})
class Point(classify(math)):
def __init__(self, x, y):
self.__x, self.__y = float(x), float(y)
def __str__(self):
return str((self.x, self.y))
def __add__(self, other):
return type(self)(self.x + other.x, self.y + other.y)
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
@classmethod
def polar(cls, direction, length):
radians = cls.radians(direction)
x = round(cls.sin(radians) * length, 10)
y = round(cls.cos(radians) * length, 10)
return cls(x, y)
if __name__ == '__main__':
main()