Python 导入某个模块时,如何重写已写入的函数?
我正在编写一个占位符点和矩形函数,但如果存在的话,我想使用Zelle的图形模块Python 导入某个模块时,如何重写已写入的函数?,python,python-3.x,Python,Python 3.x,我正在编写一个占位符点和矩形函数,但如果存在的话,我想使用Zelle的图形模块 class Pt: def __init__(self, x, y): self.x = x self.y = y if ('graphics' in sys.modules): return graphics.Point(x, y) class R: def __init__(self, tLPoint, w, h):
class Pt:
def __init__(self, x, y):
self.x = x
self.y = y
if ('graphics' in sys.modules):
return graphics.Point(x, y)
class R:
def __init__(self, tLPoint, w, h):
self.P1 = tLPoint
self.P2 = Pt(tLPoint.x + w, tLPoint.y + h)
self.x = tLPoint.x
self.y = tLPoint.y
if ('graphics' in sys.modules):
return graphics.Rectangle(P1, P2)
到目前为止,我已经得到了这段代码,但是当你通过它返回一些东西时,\uuu init\uuu
会感到恼火
我想做的是返回Zelle的图形版本(如果存在),而不是自定义版本
我不完全确定该怎么办,非常感谢您的帮助。如果您实例化了一个特定类的实例,您不能让构造函数突然返回一个完全不同类的实例。除了不起作用之外,它也会令人难以置信地困惑。也许这样的东西适合你:
def create_point(*args, **kwargs):
if 'graphics' in sys.modules:
return graphics.Point(*args, **kwargs)
return Pt(*args, **kwargs)
然后只要在需要实例时使用
create_point(x,y)
。因为类在Python中是对象,所以可以在模块级别将想要的类分配给变量
if 'graphics' in sys.modules:
Point = graphics.Point
Rectangle = graphics.Rectangle
else
Point = Pt
Rectangle = R
\uuuu init\uuuu
不应返回任何内容。。。这纯粹是在对象被构造之后初始化它,这样你就可以使用对象了……你不想在这里子类化你想要做的事情吗?继承自graphics.Point
或其他什么?@JonClements我知道。我不知道该怎么办,所以我试了一下,但没有成功。似乎最简单的方法就是让图形成为project@CalebHoward可以但这似乎是一种奇怪的方法。您将编写自己版本的图形
,以便在不存在时使用。。。现在你有了两个模块/类,它们可以做同样的事情。。。对我来说,更合理的做法是确保需要图形
,而不是将自己的副本捆绑在一起,以备不存在时使用。。。就兼容性、用户期望和以后的调试而言,这似乎是一场维护噩梦。。。我忍不住觉得你把这件事复杂化了,做了很多工作却没有真正的收获。。。只要把graphics
作为一个依赖项,你就完成了唯一的问题是两个矩形之间的参数不同(对于点来说,这不是问题)@CalebHoward那么它们似乎使用不同的接口,不能互换使用。您可以使用他们答案中所示的工厂模式,因为它们在创建后共享相同的接口。@CalebHoward记住,使用该模式可能会有问题。如果有人针对Zelle的Rectangle类的接口编程,然后他们切换到另一台无法使用该类的计算机,那么他们必须手动更改创建矩形对象的所有位置,因为调用构造函数需要一个额外的参数。如果采用这种方法,我可能不会依赖开发人员记住在该模块的某个地方导入图形,而是try:import graphics;返回图形。点(…)除了ImportError:return Pt(…)
或类似的东西。。。最终可能会加载工厂函数,除非您创建一个通用的创建工厂函数或某种代理类。。。