是否可以从类的父实例构造它的父实例?

2024-09-27 00:21:02 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个糟糕的想法(如果是的话,请告诉我),但我正在探索Python的边界,我可以看到这有多有用(事实上,我现在正在寻找一个可能的例子)。在

设置如下:

---(API文件)---

class APINode(object):
    def __init__(self, *args, **kwargs):
        # initialize some instance variables

    def render(self, arg1, arg2):
        # do some stuff and return something

def api_function( arg1, arg2 ):
    # do some stuff
    return APINode(args, kwargs)

---(我的文件)--

^{pr2}$

我想稍微修改api_函数的输出,基本上只是覆盖它返回的对象中的render函数。我觉得我的选择是:(1,糟糕)将api_函数的内容复制到my_函数中,但只需构造并返回MyNode而不是APINode,或者(2,也许?)要从my_函数调用api_函数,让它完成它的工作——构造并返回一个APINode类型的对象,然后我可以从该对象创建一个MyNode,以便覆盖该方法。在

它可以归结为:在Python中,是否可以从父类的实例构造子类的实例?在

(看起来很眼熟,或者想知道实际情况是什么?我正在尝试扩展Django模板标记。)


Tags: 文件对象函数selfapidefargssome
3条回答

我想你会更喜欢MyNode包装APINode,而不是扩展它。您可以实现自己的render()方法,并将所有其他方法委托给包装好的APINode。然后就可以从现有的APINode创建一个新的MyNode。在

无法从父实例生成子实例。父实例是APINode的实例,不能更改对象的类。在

别在家里这样做。在

>>> class A:
...     def hi(self):
...         print "I am an A!"
... 
>>> class B:
...     def hi(self):
...         print "I am a B!"
... 
>>> a = A()
>>> a.hi()
I am an A!
>>> # Doing this will likely lead to hard to find bugs.
>>> a.__class__ = B
>>> a.hi()
I am a B!
>>> 

猴子修补API!在

^{pr2}$

这仍然可能导致很难找到bug,但它更干净一些。在

重写分配器。在

class B(object):
  def __new__(cls, val):
    if val:
      return D()
    return super(B, cls).__new__(cls)

  def foo(self):
    return 'bar'

class D(object):
  def foo(self):
    return 'baz'

b1 = B(False)
b2 = B(True)
print b1.foo()
print b2.foo()

相关问题 更多 >

    热门问题