我的 Django 模型中有一個足球隊課程。我制作了 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
uj5u.com熱心網友回復:
像任何其他裝飾器一樣。裝飾器函式的引數應該只是函式,然后你在裝飾器函式中定義你的子函式,它會在執行你的函式之前進行“裝飾”。所以在這種情況下,我的裝飾器函式是play_match和 which 定義了add_onewhich 接受 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384100.html
標籤:Python 姜戈 python-装饰器
上一篇:Redis分布式鎖加鎖案例
