从另一个文件检查对象实例类型

Object instance type checking from another file

我已将 python 代码模块化为三个文件。 File1.py 有一个 class 定义,其方法和属性定义在 class 内部。 File2.py 作为程序输入之间的层,然后调用方法并对这些输入进行操作,基本上充当接口。虽然 File3.py 我将它用于输入的健全性检查。我正在使用 File3.py 中定义的一些完整性检查装饰器来装饰 class 的相关方法。一个这样的装饰器有 python 的 isinstance(input_received, class_name)。现在,由于检查发生在 File3 中,class 定义在 File1 中,装饰器只采用 class 方法作为输入,其中 input(class) 方法有 (self, input_received),我的 isinstance(input_received, class_name) 语句抛出一个错误 "'class_name' is unknown",这意味着 class_name 定义不在File3 的范围。 我在 File1 中导入了 File3,在 File2 中导入了 File1。 此外,循环导入不是一种选择。这将是一件愚蠢的事情。我的意思是,除了所有现有导入之外,还要在 File1 中导入 File3。

请帮忙!

文件 1 (arith.py)

import decors # importing the decorator for input sanity check

class Coords(object):
    def __init__(self, x, y):
        self.abscissa = x
        self.ordinate = y

    def __add__(self, other):
        """ Normal left operand addition """
        return Coords(self.abscissa + other.abscissa, self.ordinate + other.ordinate)

    def __neg__(self):
        """ Negation """
        return Coords(-self.abscissa, -self.ordinate)

    @decors.neg_san_check # decorating __sub__ method
    def __sub__(self, other):
        """ Normal left operand subtraction """
        return self + other.__neg__()

文件 3 (decors.py)

from functools import wraps

def neg_san_check(func):
    @wraps(func)
    def wrapper(obj_ref, other_obj):
          if isinstance(other_obj, (Coords, int, float)):
                func(obj_ref, other_obj)
    return wrapper

文件 2 (base.py)

from arith import Coords

c1 = Coords(3,6)
c2 = Coords(7,8)

diff = c1-c2
print(diff.abscissa)
print(diff.ordinate)

这里有一个错误:

Traceback (most recent call last):
  File "base.py", line 6, in <module>
    diff = c1-c2
  File "/home/somepath/codedir/decors.py", line 6, in wrapper
    if isinstance(other_obj, (Coords, int, float)):
NameError: name 'Coords' is not defined

注意:所有3个文件都在codedir目录

decors.py 不导入 Coords 因此行 if isinstance(other_obj, (Coords, int, float)) 抛出异常。
将装饰器移动到 arith.py 应该可以解决问题。

在浏览了很多网站之后,我在这里找到了 File3 (decors.py)

的解决方案
from functools import wraps

def neg_san_check(func):
    @wraps(func)
    def wrapper(obj_ref, other_obj):
          if isinstance(other_obj, (obj_ref.__class__, int, float)):
                func(obj_ref, other_obj)

我还想补充一个场景: 假设如果我们确定传递的实例 (other_obj) 是其他 class 类型(不同于 'obj_ref.class',那么我们可以传递其他 CLASS 的class 变量(其唯一目的是用于检查其自身 class 的类型)到当前 class.

中装饰的函数