Python:如何"合并"两个类

use*_*526 7 python merge class

我想在各个类中添加一些属性和方法.我必须添加的方法和属性是相同的,但不是分配它们的类,所以我想构建一个为参数中给出的类分配新的方法和属性的类.我尝试了这个但它不起作用:(我知道这是一种非常错误的方法,试图给自己分配一些东西,这只是为了表明我想做什么)

class A:
    def __init__(self):
        self.a = 'a'

    def getatt(self):
        return self.a

class B:
    def __init__(self, parent) :
        self = parent

        # This is working :
        print self.getatt()

    def getattB(self):
        return self.getatt()

insta = A()
instb = B(insta)

# This is not working :
print instb.getattB()
Run Code Online (Sandbox Code Playgroud)

结果是:

a
Traceback (most recent call last):
  File "D:\Documents and settings\Bureau\merge.py", line 22, in <module>
    print instb.getattB()
  File "D:\Documents and settings\Bureau\merge.py", line 16, in getattB
    return self.getatt()
AttributeError: B instance has no attribute 'getatt'
Run Code Online (Sandbox Code Playgroud)

而且我期望得到'a'来调用instb.gettattB()

要恢复,我想继承A类中的B类,在B类的参数中给出A类,因为我的B类将是各种类的子类,而不是A.

use*_*526 7

最好的答案在评论中,它对我很有用所以我决定在答案中显示它(感谢s2222):在Python中动态声明inherance的方法是type()内置函数.对于我的例子:

class A(object) :
    def __init__(self, args):
        self.a = 'a'
        self.args = args

    def getattA(self):
        return self.a, self.args

class B(object) :
    b = 'b' 
    def __init__(self, args) :
        self.b_init = args

    def getattB(self):
        return self.b

C = type('C', (A,B), dict(c='c'))

instc = C('args')

print 'attributes :', instc.a,  instc.args, instc.b, instc.c
print 'methodes :', instc.getattA(), instc.getattB()

print instc.b_init
Run Code Online (Sandbox Code Playgroud)

代码返回:

attributes : a args b c
methodes : ('a', 'args') b
Traceback (most recent call last):
  File "D:\Documents and settings\Bureau\merge2.py", line 24, in <module>
    print instc.b_init
AttributeError: 'C' object has no attribute 'b_init'
Run Code Online (Sandbox Code Playgroud)

我的类C inerhite属性和类A和类B的方法,我们添加c属性.随着C的instanciation(instc = C('args'))A 的init是调用而不是B.

对我来说非常有用,因为我必须在不同的类上添加一些属性和方法(相同).


Tho*_*ner 7

我在调用不同的构造函数时遇到了麻烦,super在这种情况下使用不一定有意义,我选择继承并手动调用当前对象上的每个构造函数:

class Foo(object):
    def __init__(self, foonum):
        super(Foo, self).__init__()
        self.foonum = foonum


class Bar(object):
    def __init__(self, barnum):
        super(Bar, self).__init__()
        self.barnum = barnum

class DiamondProblem(Foo, Bar):
    # Arg order don't matter, since we call the `__init__`'s ourself.
    def __init__(self, barnum, mynum, foonum):
        Foo.__init__(self, foonum)
        Bar.__init__(self, barnum)

        self.mynum = mynum
Run Code Online (Sandbox Code Playgroud)