更改不同类中的变量的值,而无需重写方法

问题描述 投票:-1回答:2

我有两节课。在一个类中,我有很多基于变量运行的方法。

在第二个类中,我想定义第二个变量,当此变量为true时,第一个类的方法运行。

但是,我不知道如何写这个。

我想知道如何定义新变量(在第二个类中)并确保第二个类中的此变量替换第一个类中的变量(当此变量为true时)。

例如:

class One():
   def MethodOne( self ):

        if self.this.VariableOne:
          do something
          do something else
          do another thing
          return something

class Two(One):
   def MethodOne( self ):

        if self.this.VariableTwo:
          run all the other code in MethodOne(), (if the variable is VariableTwo, but replacing VariableOne.

我不确定这里的最佳方法。

但我仍然希望MethodOne方法(从不同的类)运行,但使用不同的变量。

python inheritance methods multiple-inheritance class-method
2个回答
0
投票

如果我正确理解你的问题,我认为最简单的方法就是在One上创建一个类变量,只需将其设置为false即可。就像是:

class One():
   force = False

   def MethodOne( self ):
        if self.this.VariableOne or self.force:
          do something
          do something else
          do another thing
          return something

class Two(One):
    force = True

0
投票

我认为最好的方法是在所有函数中使用装饰器,在元类中实现(来自Attaching a decorator to all functions within a class):

class TheMeta(type):
    def __new__(cls, name, bases, namespace, **kwds):
        # my_decorator = cls.my_decorator (if the decorator is a classmethod)
        namespace = {k: v if k.startswith('__') else Variablecheck(v) for k, v in namespace.items()}
        return type.__new__(cls, name, bases, namespace)

装饰者:

def Variablecheck(func):
    @functools.wraps(func)
    def wrapper_Variablecheck(*args, **kwargs):
        # if inspect.isclass(type(args[0])):
        if args[0].this.VariableTwo:
            return func(*args, **kwargs)

然后,你尝试用:

class One(metaclass=TheMeta):
    # rest of the definition

否则,如果要保持原始类的原样,也可以将元类应用于继承类。

© www.soinside.com 2019 - 2024. All rights reserved.