从另一个文件检查对象实例类型
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.
中装饰的函数
我已将 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.
中装饰的函数