我对python很陌生,在玩转 PIL
. 我已经写好了。
from PIL import Image
class FImage(Image.Image):
def foo(self):
我用的是... Image.open()
函数来初始化图像,但我不知道如何将其转换为 FImage
. 这样做可行吗?如果可以,我怎么去做呢?
只是编辑一下,以澄清一些问题。Image
在 Image.open()
指的是 .py
文件,而不是类本身。
因为 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
子孙。看来《枕头》的作者不管出于什么原因,都希望你不要创建后裔。