Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入某个模块时,如何重写已写入的函数?_Python_Python 3.x - Fatal编程技术网

Python 导入某个模块时,如何重写已写入的函数?

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):

我正在编写一个占位符点和矩形函数,但如果存在的话,我想使用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):
        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(…)
或类似的东西。。。最终可能会加载工厂函数,除非您创建一个通用的创建工厂函数或某种代理类。。。