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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改不同类中的变量的值,而无需重写方法相关的知识,希望对你有一定的参考价值。

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

在第二个类中,我想定义第二个变量,当此变量为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方法(从不同的类)运行,但使用不同的变量。

答案

如果我正确理解你的问题,我认为最简单的方法就是在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
另一答案

我认为最好的方法是在所有函数中使用装饰器,在元类中实现(来自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

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

以上是关于更改不同类中的变量的值,而无需重写方法的主要内容,如果未能解决你的问题,请参考以下文章

如何更改指针变量的值并将更改保留在函数之外而无需通过引用传递?

根据一维数组中的值更改二维numpy数组中的某些值而无需for循环

同构 React 中的实时环境变量

Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?

Android Honeycomb:如何更改 FrameLayout 中的片段,而不重新创建它们?

通过java中不同类中的静态方法设置和获取静态变量值