如何在 models.py 中制作装饰器?
How can I make a decorator in models.py?
我的 django 模型中有一支足球队 class。我做了 3 种赢、平和输的方法,其中 self.Points_of_the_season
将相应修改(+3 赢,+1 平,+0 输)。但是当我编写这些方法时,我必须在每次调用 3 种方法时更改 self.Match_Played
。我怎样才能制作一个名为 @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
与任何其他装饰器一样。装饰器函数的参数应该只是函数,然后你在装饰器函数中定义你的子函数,它将在执行你的函数之前进行“装饰”。所以在这种情况下,我的装饰器函数是 play_match
,它定义了 add_one
接受 self 参数,因此它可以访问 class 变量。然后它递增 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
我的 django 模型中有一支足球队 class。我做了 3 种赢、平和输的方法,其中 self.Points_of_the_season
将相应修改(+3 赢,+1 平,+0 输)。但是当我编写这些方法时,我必须在每次调用 3 种方法时更改 self.Match_Played
。我怎样才能制作一个名为 @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
与任何其他装饰器一样。装饰器函数的参数应该只是函数,然后你在装饰器函数中定义你的子函数,它将在执行你的函数之前进行“装饰”。所以在这种情况下,我的装饰器函数是 play_match
,它定义了 add_one
接受 self 参数,因此它可以访问 class 变量。然后它递增 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