我正在嘗試學習 Python OOP,并且一直在努力理解范圍、傳遞值以及如何封裝。我早期的嘗試很快變成了意大利面條代碼(可能是因為我唯一的編程經驗是 40 年前的 8 位 BASIC),因此,我正在嘗試類和物件。這里是:
import random
class Player:
def __init__(self, weapon, health):
self.weapon = weapon
self.health = health
def reduce_health(self, amount):
self.health -= amount
def check_dead(self):
if self.health > 0:
return "Player not dead"
else:
return "Player dead"
def calculate_damage(self, weapon):
damage_inflicted = random.randint(3, 15) weapon
return damage_inflicted
def fight(self):
player.reduce_health(self.calculate_damage(self.weapon))
print(player.health)
player.check_dead()
player = Player(1, 15)
player.fight()
calculate_damage 函式被標記為“靜態”,而 check_dead 函式似乎根本沒有任何效果。我需要一些提示才能站穩腳跟。謝謝。
uj5u.com熱心網友回復:
您的代碼中有一些錯誤。
首先,您在戰斗函式中使用了 player 變數。這是可行的,因為您已經呼叫了Player
class的實體player
,但如果您給它任何其他名稱,它就不會。要解決您的問題,請在所有類函式中使用self
而不是。player
該self
引數由 python 自動傳入,并且始終參考呼叫函式的物件。
其次,該check_dead
函式什么都不做,因為它只回傳一個值。此函式中沒有列印出屬性集或值。為了使其作業,您需要在函式內部或外部列印值以及函式的回傳值。
此代碼應該可以作業:
import random
class Player:
def __init__(self, weapon, health):
self.weapon = weapon
self.health = health
def reduce_health(self, amount):
self.health -= amount
def check_dead(self):
if self.health > 0:
return "Player not dead"
else:
return "Player dead"
def calculate_damage(self, weapon):
damage_inflicted = random.randint(3, 15) weapon
return damage_inflicted
def fight(self):
self.reduce_health(self.calculate_damage(self.weapon))
print(player.health)
print(self.check_dead())
player = Player(1, 15)
player.fight()
在這段代碼中,我們直接列印玩家的活躍度而不是回傳它:
import random
class Player:
def __init__(self, weapon, health):
self.weapon = weapon
self.health = health
def reduce_health(self, amount):
self.health -= amount
def check_dead(self):
if self.health > 0:
print("Player not dead")
else:
print("Player dead")
def calculate_damage(self, weapon):
damage_inflicted = random.randint(3, 15) weapon
return damage_inflicted
def fight(self):
self.reduce_health(self.calculate_damage(self.weapon))
print(player.health)
self.check_dead()
player = Player(1, 15)
player.fight()
uj5u.com熱心網友回復:
您遇到的問題可能是由于您參考 check_dead()、reduce_health() 的函式和 Fight() 中的變數 health 的方式。您正在呼叫播放器類實體,而不是函式正在其中運行的實體,這意味著,如果您要將播放器類實體的名稱更改為不同的名稱,則會溢位錯誤“播放器不是定義”。
為什么 check_dead() 不作業也可能是因為它不列印出值,它只是回傳它們,并且當它回傳到呼叫函式時你沒有對它們做任何事情,它只是廢棄它們。
我建議檢查代碼是否拼寫正確,并將類中的每個參考替換為 self. 并且還要將 check_dead() 函式包裝在 Fight() 函式中的 print 中。最終會看起來像這樣:
import random
class Player:
def __init__(self, weapon, health):
self.weapon = weapon
self.health = health
def reduce_health(self, amount):
self.health -= amount
def check_dead(self):
if self.health > 0:
return "Player not dead"
else:
return "Player dead"
def calculate_damage(self, weapon):
damage_inflicted = random.randint(3, 15) weapon
return damage_inflicted
def fight(self):
self.reduce_health(self.calculate_damage(self.weapon))
print(self.health)
print(self.check_dead())
player = Player(1, 15)
player.fight()
如果這仍然不起作用,則可能是您的運行環境或您的 ide/編輯器。
還:
靜態意味著,該功能獨立
如果一個函式是靜態的,它不使用類提供的任何函式/變數(通常通過使用 self.[函式/變數名] 獲得)。這樣它是獨立的,它可以在類之外撰寫,它仍然可以按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496394.html