Как сделать декоратор в models.py?
У меня есть класс футбольной команды в моей django Model. Я сделал 3 метода победы, ничьей и поражения, где self.Points_of_the_season
будет изменяться соответственно (+3 для победы, +1 для ничьей и +0 для поражения). Но когда я написал эти методы, мне приходится изменять self.Match_Played
при каждом вызове этих 3 методов. Как я могу сделать декоратор с именем @play_match
, который будет добавлять 1 к соответствующему полю?
Вот код файла models.py:
class Team(models.Model):
Team_name = models.CharField(max_length=255)
Foundation_year = models.IntegerField()
Points_of_season = models.IntegerField(default=0)
Match_Played = models.IntegerField(default=0)
League = models.ForeignKey(League, on_delete=models.CASCADE)
def __str__(self):
return f"{self.Team_name}-{self.Foundation_year}"
@play_match
def win(self):
self.Points_of_season += 3
@play_match
def draw(self):
self.Points_of_season += 1
@play_match
def lose(self):
pass
Как и любой другой декоратор. Аргументом функции-декоратора func должна быть просто функция, затем вы определяете свою подфункцию внутри функции-декоратора, которая будет выполнять "украшение" перед выполнением вашей функции. В данном случае, моя функция-декоратор play_match
, которая определяет add_one
, которая принимает аргумент self, чтобы получить доступ к переменным класса. Затем она увеличивает Match_Played, а затем вызывает функцию, переданную декоратору.
class Team:
Team_Name = ""
Foundation_year = 0
Points_of_season = 0
Match_Played = 0
League = "league"
def __str__(self):
return f"{self.Team_name}-{self.Foundation_year}"
def play_match(func):
def add_one(self):
self.Match_Played += 1
func(self)
return add_one
@play_match
def win(self):
self.Points_of_season += 3
@play_match
def draw(self):
self.Points_of_season += 1
@play_match
def lose(self):
pass
x = Team()
x.win()
print("Num matches: ", x.Match_Played)
x.draw()
print("Num matches: ", x.Match_Played)
выходы:
Num matches: 1
Num matches: 2