if条件用于类中的多个方法

Ale*_*lex 1 python methods class

我正在使用python编写,以便在使用类时更好地了解良好实践.我为几个班写了几个方法; 狗和人.我已经介绍了一种叫做die的狗的新方法,定义如下:

def die(self):
    if self.owner:
        self.owner.pets.discard(self)
    self.owner = None
    self.dead = True
Run Code Online (Sandbox Code Playgroud)

现在我不希望能够将大多数其他方法用于死狗,即采用宠物的方法(person.adopt(self,pet)).由于有这种情况的方法很多(并且可能还有更多),我想避免在每个要求狗活着的方法中添加if语句.有没有办法简单地不允许某些方法给出一个条件,如self.dead == False?

Jak*_*fin 6

如何使用装饰器?你将不得不装饰每个需要宠物活着的功能,但你将避免不得不一遍又一遍地编写if逻辑:

>>> def require_alive(func):
...     def wrapper(self, *args, **kwargs):
...         if not self.alive:
...             raise Exception("Not alive")
...         return func(self, *args, **kwargs)
...     return wrapper
...
>>> def require_hungry(func):
...     def wrapper(self, *args, **kwargs):
...         if not self.hungry:
...             print "Not hungry..."
...         else:
...             return func(self, *args, **kwargs)
...     return wrapper
...
>>> class Pet(object):
...     def __init__(self):
...         self.alive = True
...         self.hungry = True
...     def die(self):
...         self.alive = False
...     @require_alive
...     @require_hungry
...     def eat(self):
...         print "Eating..."
...         self.hungry = False
...     @require_alive
...     def sleep(self):
...         print "Sleeping..."
...
>>> roofus = Pet()
>>> roofus.eat()
Eating...
>>> roofus.eat()
Not hungry...
>>> roofus.sleep()
Sleeping...
>>> roofus.die()
>>> roofus.eat()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in wrapper
Exception: Not alive
Run Code Online (Sandbox Code Playgroud)