Каждый раз, когда переменная изменяется, я хочу, чтобы определенная функция была выполнена - PullRequest
0 голосов
/ 23 сентября 2018

Поэтому, когда я меняю переменное здоровье, я пытаюсь сообщить пользователю, что его здоровье изменилось, напечатав «Ваше здоровье% s».Вот как это выглядит ...

health=5

def start():         
  global health
  health+=2

Так что мне интересно, есть ли способ информировать пользователя о какой-то всеобъемлющей функции, которая находится не внутри этой функции start(), а за ее пределами, так чтокаждый раз, когда меняется переменная здоровья он печатает то и это?Я учу Python, поэтому не судите!

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

Мы можем создать подтип int.

class Health(int):
    def __new__(cls, value):
        return int.__new__(cls, value)
    def __iadd__(self, other):
        print(f"+{other} health")
        return self.__class__(self + other)
    def __isub__(self, other):
        print(f"-{other} health")
        return self.__class__(self - other)

Это немного сложная, но интересная способность.

In [1]: h = Health(10)

In [2]: h += 2
+2 health

In [3]: h -= 3
-3 health

In [4]: h
Out[4]: 9

Но я предпочитаю подход @ timgeb

0 голосов
/ 23 сентября 2018

Мы можем добиться большего успеха, чем то, что вы пытаетесь сделать, имея класс Player с пользовательским крюком __setattr__.

class Player:
    def __init__(self):
        vars(self)['health'] = 100 # suppress __setattr__

    def __setattr__(self, attr, value):
        if attr == 'health':
            print('health changed to {}'.format(value))
        super().__setattr__(attr, value)

Конечно, вы можете расширить этот класс в соответствии со своими потребностями,Например, вы можете добавить атрибут name и напечатать '{}'s health changed to {}'.format(self.name, value).

Демо:

>>> p = Player()
>>> p.health
100
>>> p.health += 2
health changed to 102

В качестве бонуса, теперь вы можете иметь несколько игроков с разными уровнями здоровья нав то же время и не нужно управлять глобальными переменными.

0 голосов
/ 23 сентября 2018
health=5

def start():
    new_health= health +2
    print new_health, health

Я считаю, что это то, что вы ищете.Поскольку ваша переменная является глобальной, ее можно изменить в любом месте вашей программы. Таким образом, напечатав обе, вы увидите, что ваше исходное здоровье не изменится.

0 голосов
/ 23 сентября 2018

Я думаю, что самый простой способ - определить функцию где-то в вашем коде:

health = 5
def main():
    global health
    def change_health(amount):
        health += amount
        print('your health went {} by {}'
              .format('up' if amount > 0 else 'down',
                      abs(amount)))

    change_health(-2)

Эта функция использует глобальную переменную health и изменяет ее.Затем, как описано, распечатывает это сообщение.Строка 'up' if amount > 0 else 'down' мне показалась довольно изящной: она приводит к форматированию либо up, либо down в зависимости от того, положительное число или нет.

Строка формата означает, что каждый {} будет заменен на любое значение, введенное в вызове .format() в соответствующих позициях.

...