根据导入成功定义class方法

Define class method based on import success

我有一些接口 class,如果 numpy 可用,我会为 class(更快的实现)

提供一些额外的方法

可以根据导入成功定义一些函数,但相同的代码不适用于 class 方法。

这个代码

try:
    import numpy

    def main2():
        ret_array= numpy.array([],dtype=numpy.double)
        return ret_array
except ImportError:
    def main2():
        print ("do nothing")

成功定义了一个 main2() 其中 returns 一个空的 numpy 数组

但是这段代码

class xxx:
    try:
        import numpy

        def main2():
            ret_array= numpy.array([],dtype=numpy.double)
            return ret_array
    except ImportError:
        def main2():
            print ("do nothing")

导致异常 如果我尝试调用 main2()

xxx.main2()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "test2.py", line 17, in main2
    ret_array= numpy.array([],dtype=numpy.double)
NameError: name 'numpy' is not defined

还有其他方法可以实现吗? (根据模块的可用性定义不同的 class 方法)

try:
    import numpy

    class xxx:
        def main2(self):
            ret_array = numpy.array([],dtype=numpy.double)
            print(ret_array)
except:
    class xxx:
        def main2(self):
            print("do nothing")

你可以试试:

class Test:
    def test(self):        
        try:
            import numpy
            import_succeeded = True
        except:
            import_succeeded = False
        
        if import_succeeded:
            pass
        else:
            pass

感谢我收到的所有提示

我要使用的解决方案是:

try:
    import numpy
except ImportError:
    numpy = None

class xxx:

    if numpy:
        def main2():
            ret_array= numpy.array([],dtype=numpy.double)
            return ret_array
    else:
        def main2():
            print ("do nothing")

(再次)导入第一个版本的 main2() 中的模块将起作用。

class xxx:
    try:
        import numpy
        def main2():
            import numpy
            ret_array= numpy.array([],dtype=numpy.double)
            return ret_array
    except ImportError:
        def main2():
            print ("do nothing")

y = xxx.main2()
print(y)

使用ABC

from abc import ABC, abstractmethod

class ICalculator(ABC):
  @abstractmethod
  def calculate(self) -> int:
    pass

class CalculatorNoNumPy(ICalculator):
    def calculate(self):
      return 7

class CalculatorWithNumPy(ICalculator):
    def calculate(self):
      return 9

try:
  import YouCantFindMe # TODO: replace with numpy
  calculator = CalculatorWithNumPy()
except ImportError:
   calculator = CalculatorNoNumPy()

print(calculator.calculate())