繁体   English   中英

如何将父对象转换(继承)为子对象 class?

[英]How to convert (inherit) parent to child class?

我想知道如何将一些 function 返回的父 object 转换为子 class。

class A(object):
    def __init__():
        pass

class B(A):
    def functionIneed():
        pass

i = module.getObject() # i will get object that is class A
j = B(i) # this will return exception
j.functionIneed()

我无法更改 class A。如果可以的话,我会将 functionIneed 实现为 class A,但由于代码结构,这是不可能的。

Python 不支持“铸造”。 您将需要编写B.__init__()以便它可以接受A并适当地初始化自身。

我有一个强烈的怀疑,不,确信,你的程序设计有一些可怕的错误,它要求你这样做。 在 Python 中,与 Java 不同,很少有问题需要类来解决。 如果您需要 function,只需定义它:

def function_i_need(a):
     """parameter a: an instance of A"""
     pass # do something with 'a'

但是,如果我不能劝阻您不要让 function 成为 class 的方法,您可以通过设置实例的__class__属性来更改实例的 class:

>>> class A(object):
...     def __init__(self):
...         pass
... 
>>> class B(A):
...     def functionIneed(self):
...         print 'functionIneed'
... 
>>> a = A()
>>> a.functionIneed()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'functionIneed'
>>> a.__class__ = B
>>> a.functionIneed()
functionIneed

只要 B 没有__init__方法,这就会起作用,因为很明显, __init__永远不会被调用。

你说你想实现这样的东西:

class B(A):
    def functionIneed():
        pass

但实际上你要做的更像这样(除非你一开始就打算制作classstatic方法):

class B(A):
    def functionIneed(self):
        pass

然后你可以调用B.functionIneed(instance_of_A) (这是必须self显式传递给方法的优点之一。

您没有正确定义类。 应该是这样的:

class A(object):
    def __init__(self):
        pass

class B(A):
    def __init__(self):
        super(B,self).__init__()

    def functionIneed(self):
        pass

那么你就可以

j=B()
j.fuctionIneed()

不出所料

你忘了参考ins

跳出框框思考:

不是将新的 class 与您想要的 function 相提并论,而是将 function 添加到您已有的 class 或实例中怎么样?

Adding a Method to an Existing Object Instance中对此有很好的描述

怎么样:

i = module.getObject() # i will get object that is class A
try:
    i.functionIneed()
except AttributeError:
    # handle case when u have a bad object

阅读鸭子打字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM