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?
如何使用装饰器?你将不得不装饰每个需要宠物活着的功能,但你将避免不得不一遍又一遍地编写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)