python - 如何在 python 中将父类的实例转换为其子类之一?
问题描述
我对 python 很陌生,在玩PIL
. 我曾写过:
from PIL import Image
class FImage(Image.Image):
def foo(self):
我正在使用该Image.open()
函数来初始化图像,但我不知道如何将其转换为FImage
. 这是可行的吗?如果是这样,我将如何去做?
只是为了清除某些内容而进行的编辑,Image
inImage.open()
指的是.py
文件,而不是类本身。
解决方案
由于open()
它是Image
模块的函数而不是Image.Image
类的方法,因此您不能只覆盖它并让它返回 FImage。
但是,您可以open()
在自己的 FImage 模块中定义一个函数,而不是继承自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
会隐藏内置函数。枕头不应该一开始就用它……也许fopen()
吧?
请注意,FImage
我提出的解决方案在技术上不是Image.Image
. 无论如何,您都可以决定继承,但是您也必须实现抽象方法。
最后,在我看来,这是 Pillow 模块中的一个设计缺陷。如果他们为该类创建了open()
一个类方法Image
,您将能够覆盖它并更轻松地创建Image
后代。无论出于何种原因,Pillow 的作者似乎都希望您不要创建后代。
推荐阅读
- javascript - How to Clone an Array With a Removed Element?
- javascript - 登录 PHP:使用 MYSQL 在单页中进行用户级别登录
- thymeleaf - Compare values in DropDown list and select Default value in Thymeleaf
- powershell - 如何使用 PowerShell 从 SharePoint 获取所有文档的列表?
- javascript - React-Redux - Parsing error: Unexpected token, expected "," in action creator
- python - 从 VBA(或命令行)启动 Anaconda Prompt
- amazon-web-services - AWS SDK doesn't work on Azure Web App service
- php - MySQL not updating all records from loop
- amazon-web-services - Amazon S3 将多个文件从一个存储桶复制到另一个存储桶
- java - 如何使用递归回溯器java制作迷宫