所以我有了這個想法,通過使用串列、類、物件和一些嵌套的 for-each 回圈技巧來創建一個 python 程式來處理資料關系。
我不明白如何以一種可用的方式從類的內部函式/方法傳遞資料來構建我的程式。5 年前,我在使用 c 時遇到了類似的問題,并且養成了將函式呼叫為另一個函式的引數/引數的壞習慣,例如,通過回傳函式獲取位圖影像,并將該函式呼叫作為引數/引數傳遞給另一個函式呼叫(由于我的模塊化,我似乎不得不使用指標技巧將影像資料從一個代碼檔案獲取到另一個代碼檔案中)。甚至沒有學習 Compsci 課程,我就知道我的代碼很粗略。
現在,在當前專案中,我想創建一堆游戲標題,然后是平臺,并以某種方式列出游戲以及游戲所在的平臺。我的程式基于我在 ac# 示例中看到的內容,但我在 Python 中執行此操作。
不知何故,在程式的主要部分,我需要列印游戲名稱以及它可用的平臺。我正在嘗試將平臺物件添加到游戲物件串列中(將 xbox 和 playstation 添加到游戲中,諾曼底上的秘密武器),然后我想列印這些平臺的字串(它們的名稱)。
主程式應該有一個嵌套的 for 回圈,它迭代游戲,然后迭代它們的平臺串列并以某種方式列印平臺的名稱 - 反之亦然,列出平臺下的游戲。將游戲標題作為一個串列放在平臺類物件下會更簡單,但游戲應該有自己的資料,因此是一個類。
如何將這些物件及其資料與另一個類的物件鏈接?我應該使用什么來代替串列嗎?
class Game:
name = ""
availability = []
def __init__(self, InputName):
self.availability = []
print ("created, " InputName)
name = InputName
def ShowAvailability(self):
return (iter(self.availability))
class Platform:
name = ""
def __init__(self, InputName):
print "created, " InputName
name = InputName
def GrabName():
return name
# Game titles
SecretWeapons = Game("Secret Weapons Over Normandy")
Halo = Game("Halo Combat Evolved")
DeathStranding = Game("Death Stranding")
# Platforms
Xbox = Platform("Xbox")
PlayStation = Platform("Playstation")
SecretWeapons.availability.append(Xbox)
SecretWeapons.availability.append(PlayStation)
for i in SecretWeapons.ShowAvailability():
print (i.GrabName)
另一種不這樣做的方法:
class Game:
name = ""
availability = []
def __init__(self, InputName):
self.availability = []
print ("created, " InputName)
name = InputName
# Prepare to fail...
def ShowAvailability(self):
return self.availability
class Platform:
name = ""
AvailableGames = []
def __init__(self, InputName):
print "created, " InputName
name = InputName
def GrabName():
return name
# Game titles
SecretWeapons = Game("Secret Weapons Over Normandy")
Halo = Game("Halo Combat Evolved")
DeathStranding = Game("Death Stranding")
# Platforms
Xbox = Platform("Xbox")
PlayStation = Platform("Playstation")
SecretWeapons.availability.append(Xbox)
SecretWeapons.availability.append(PlayStation)
mylist = SecretWeapons.ShowAvailability()
# OOOOFFFFFFF! It won't print the platforms for the game.
for element in mylist:
print(element)
最后,嘗試傳遞字串而不是物件。無用的想法,因為那時資料只是單向鏈接......但是:
SecretWeapons.availability.append(Xbox.name)
SecretWeapons.availability.append(PlayStation.name)
SecretWeapons.ShowAvailability()
在沒有 init 的情況下顯示類的功能:
類游戲:
name = ""
availability = []
def ShowAvailability(self):
for mystuff in self.availability:
print(mystuff)
uj5u.com熱心網友回復:
在 Game 類中創建一個 Platform 函式,而不是讓 Platform 成為它自己的類。請記住,'self' 將保持每個物件的所有值分開。
class Game:
def __init__(self, inputName):
self.name = inputName
self.platforms = []
def addPlatforms(self, *args):
for arg in args:
self.platforms.append(arg)
如何使用
SecretWeapons = Game("Secret Weapons Over Normandy")
SecretWeapons.addPlatforms('Xbox', 'Playstation')
for platform in SecretWeapons.platforms:
print(platform)
# Output
Xbox
Playstation
您首先遇到代碼問題的原因是因為您根本沒有使用selfPlatform 類。自我是指物件本身。當您只是向namePlatform 類中的變數添加一個值時,該值沒有可參考的內容。使用self.nameinstead 只會將值添加到name您分配給它的物件的變數中。
我個人認為你應該一起放棄 Platform 類。除非您打算擴展它并為其添加更多功能,否則沒有理由創建一個唯一目的是為變數賦值并回傳它的值的類。您可以為此使用變數或串列,而不是類。
如果你想保留你的原始代碼,那么這里是它的一個功能版本。
class Game:
def __init__(self, InputName):
self.availability = []
print ("created, " InputName)
self.name = InputName
def ShowAvailability(self):
return self.availability
class Platform:
def __init__(self, InputName):
print ("created, " InputName)
self.name = InputName
def GrabName(self):
return self.name
# Game titles
SecretWeapons = Game("Secret Weapons Over Normandy")
Halo = Game("Halo Combat Evolved")
DeathStranding = Game("Death Stranding")
# Platforms
Xbox = Platform("Xbox")
PlayStation = Platform("Playstation")
SecretWeapons.availability.append(Xbox)
SecretWeapons.availability.append(PlayStation)
for i in SecretWeapons.ShowAvailability():
print (i.GrabName())
另外,請記住在呼叫GrabName(). 像您在原始代碼中所做的那樣,在不帶括號的情況下呼叫它,將回傳函式本身,而不是實際執行函式。您無法回傳任何結果的另一個原因。
uj5u.com熱心網友回復:
你可以做這樣的事情來讓游戲物件知道平臺,讓平臺物件知道游戲。
請注意,與 in 不同C#,您很少希望在類級別指定欄位(除非您使用資料類,這個簡單示例不會使用)。
class Game:
def __init__(self, name):
self.name = name
self.platforms = set()
def add_platform(self, platform):
if platform not in self.platforms:
self.platforms.add(platform)
platform.add_game(self)
class Platform:
def __init__(self, name):
self.name = name
self.games = set()
def add_game(self, game):
if game not in self.games:
self.games.add(game)
game.add_platform(self)
g1 = Game("Secret Weapons Over Normandy")
g2 = Game("Halo Combat Evolved")
g3 = Game("Mario Kart 8")
xbox = Platform("Xbox")
ps = Platform("Playstation")
switch = Platform("Switch")
g1.add_platform(xbox)
g1.add_platform(ps)
g2.add_platform(xbox)
g3.add_platform(switch)
for plat in (xbox, ps, switch):
print(plat.name, ":", ", ".join(g.name for g in plat.games))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/504567.html
上一篇:類創建自己的物件
