gpt4 book ai didi

python - 如何最好地使用父类中的对象初始化子类的对象?

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:22 32 4
gpt4 key购买 nike

我想创建现有包类的子类(我不想/不能更改其源代码)。类的对象仅使用字符串进行初始化,然后使用各种 add 函数进行填充。一个最小的例子看起来像这样(没有任何 add 函数):

import copy


class Origin(object):
def __init__(self, name):
self.name = name
self.dummy_list = [1, 2, 'a']
self.dummy_stuff = {'a': [12, 'yt']}

def make_copy(self):
return copy.deepcopy(self)

def dummy_function(self):
return len(self.dummy_list)

我想创建一个子类,以便我可以使用 Origin 的实例初始化它的实例。一个简单的方法是

class BasedOnOrigin(Origin):
def __init__(self, origin_instance, new_prop):
Origin.__init__(self, origin_instance.name)
self.dummy_list = copy.deepcopy(origin_instance.dummy_list)
self.dummy_stuff = copy.deepcopy(origin_instance.dummy_stuff)
self.new_prop = new_prop

令人讨厌的是,我需要复制所有我需要提前知道的东西。

另一种选择是

class BasedOnOrigin2(Origin):
def __init__(self, origin_instance, new_prop):
Origin.__init__(self, origin_instance.name)
self = origin_instance.make_copy()
self.new_prop = new_prop

但是 self = 部分看起来很不标准并且 new_prop 没有设置,所以我需要一个额外的函数。

有没有标准的方法来做到这一点?

上述的替代方法是使用例如将附加功能添加到现有实例

from functools import partial

def add_function(obj, func):

setattr(obj, func.__name__, partial(func, obj))

但如果 (i) 有很多功能要添加,并且 (ii) 有很多实例需要添加功能,这可能会很烦人。

最佳答案

but the self = part looks rather non-standard and new_prop is not set

self 只是一个普通的局部变量,因此重新绑定(bind)它只会影响局部范围。

Is there a standard way of doing this?

从你的描述看来,你真正的问题是你有另一个库创建的你不想/不能修改的类实例,你真正想要的是添加新方法(并最终覆盖一些方法)到那些对象,但不能,因为你可以告诉这个库使用你自己的类。

如果要点纯粹是用您自己的版本“替换”原始类(因此原始类的所有实例都会受到更改的影响),规范的解决方案是 monkeypatch the original class :

from otherlib import TheClass

def patch_the_class():
# we do this in a function to avoid
# polluting the global namespace

# add a new method

def newmethod(self):
# code here

TheClass.newmethod = newmethod

# override an existing method

# keep a reference to the original so
# we can still use it:
_original = TheClass.some_method

def mymethod(self, arg):
something = _original(self, arg)
# additional stuff here
return something

TheClass.some_method = mymethod

patch_the_class()

只需确保在使用修补类之前执行此操作即可。

此解决方案(wrt/单独修补每个实例)的优点是成本较低,并且保证没有人会忘记修补实例。

现在请注意,monkeypatches 被视为临时解决方法或最后的黑客手段。如果您要修补的库是 OSS,您可以修改它以改进原始类或实现某种方式使具体类使用可配置并将其贡献回来。

关于python - 如何最好地使用父类中的对象初始化子类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043969/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com