类以实例作为参数

时间:2018-10-17 12:00:42

标签: python

我有以下课程:

class Optimization_problem():
    def __init__(self, **args):
        if 'function' in args:  
            self.function = args['function']
        if 'gradient' in args:  
            self.gradient = args['gradient']
        else:
            def deriv(x):
                return nd.Gradient(self.function)(x)
            self.gradient= deriv

        if 'acc' in args:  
            self.acc = args['acc']

我想创建一个类Optmization_method,该类继承上述类的属性,从而可以执行以下操作:

f = lambda x: 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2
problem = Optimization_problem(function=f, acc=1.e-3)
method = Optimization_method(problem) # I want to be able to do this

我尝试了以下方法,但不起作用。

class Optimization_method(Optimization_problem):    
    def __init__(self, **args):
        Optimization_problem.__init__(self, **args)

    #methods......

1 个答案:

答案 0 :(得分:1)

您只是传递了一个简单的单一参数。如果要跨属性复制,则必须专门查找此类实例并复制所需的数据。就像复制__dict__映射一样简单:

if len(args) == 1 and isinstance(args[0], Optimization_problem):
    self.__dict__.update(args[0].__dict__)
    return

请注意,这与继承无关;继承不能使您从基类复制状态(数据),而是可以重用和扩展功能

如果您想重用特定实例的属性,只需存储对实例的引用,即一个名为 composition 的概念:

class Optimization_method:    
    def __init__(self, problem):
        self.problem = problem

    def method1(self,x):
        return self.problem.function(x)

仅当您希望Optimization_method实例支持与Optimization_problem相同的操作时,才使用继承。如果希望能够引用其他实例的状态和功能来了解当前类需要实现的功能,请使用组合。