如何在python中把一个父类的实例转换为它的一个子类?

问题描述 投票:0回答:1

我对python很陌生,在玩转 PIL. 我已经写好了。

from PIL import Image

class FImage(Image.Image):
    def foo(self):

我用的是... Image.open() 函数来初始化图像,但我不知道如何将其转换为 FImage. 这样做可行吗?如果可以,我怎么去做呢?

只是编辑一下,以澄清一些问题。ImageImage.open() 指的是 .py 文件,而不是类本身。

python oop python-imaging-library
1个回答
0
投票

因为 open() 是一个函数 Image 模块,而不是 Image.Image 类,你不能直接覆盖它并让它返回一个 FImage。

然而,你可以定义一个 open() 函数,而不是继承自 Image.Image (这也意味着实现它的抽象方法),你可以直接封装一个 Image.Image 实例,并将任何你无法处理的引用传递给它。

from PIL import Image


class FImage:
    def __init__(self, img: Image.Image):
        self._img = img

    def foo(self):
        print(f'Hello foo, from {type(self)}')

    def __getattr__(self, attr):
        return getattr(self._img, attr)


def open(*args, **kwargs):
    return FImage(Image.open(*args, **kwargs))


# calling your open, not Image.open directly, passing all parameters
fimg = open('test.png')

# just showing the resulting fimg is an FImage, with all Image functionality
size = 16, 16
fimg.thumbnail(size)
fimg.save("test.icon.png", "PNG")

# but also any FImage functionality
fimg.foo()

顺便说一下,如果你不是想替换对这个函数的引用 Image 模块,并引用您自己的 FImage (?)模块,我非常建议将替换的名称改为"? open() 函数,因为 open 阴影的内置功能。Pillow不应该一开始就使用这个功能... ... 也许 fopen()

请注意 FImage 在我提出的解决方案中,从技术上讲,这并不是一个简单的问题。Image.Image. 反正你可以决定继承,但那样你也得实现抽象方法。

最后,在我看来,这是Pillow模块的一个设计缺陷。如果他们做了 open() 的类方法 Image 类,你将能够覆盖它,并更容易地创建一个 Image 子孙。看来《枕头》的作者不管出于什么原因,都希望你不要创建后裔。

© www.soinside.com 2019 - 2024. All rights reserved.