Изменить значение переменной в другом классе, без переписывания метода - PullRequest
0 голосов
/ 14 января 2019

У меня есть два класса. В одном классе у меня есть много методов, которые запускаются на основе одного из переменных.

А во втором классе я хочу определить вторую переменную, в которой выполняются методы класса один, когда эта переменная равна 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 запускался (из другого класса), но вместо этого использовал другую переменную.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я думаю, что лучшим способом было бы использовать декоратор для всех функций, реализованных в метаклассе (из Присоединение декоратора ко всем функциям в классе ):

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

В противном случае вы также можете применить метакласс к наследующему классу, если хотите сохранить исходный класс как есть.

0 голосов
/ 14 января 2019

Если я правильно понимаю ваш вопрос, я думаю, что самый простой способ добиться этого - создать переменную класса уже в 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
...