我在這里找到了這個幻想名稱生成器。
我正在嘗試調整代碼以適應我的目的。我想使用name_gen類中的函式自動創建一個 NPC 名稱NPC。NPC的特點是:
class NPC:
def __init__(self, name, age, gender):
self.name = name_gen
self.age = 25
self.gender = M
我需要的名稱生成器的代碼如下:
from random import randrange
def line_appender(file_path, target):
file = open(file_path, "r")
splitfile = file.read().splitlines()
for line in splitfile:
target.append(line)
def name_selector(target_list):
selected = target_list[randrange(len(target_list))]
return selected
def name_builder(first_name_list_path, last_name_list_path):
first_name_list = []
last_name_list = []
line_appender(first_name_list_path, first_name_list)
line_appender(last_name_list_path, last_name_list)
first_name_selected = name_selector(first_name_list)
last_name_selected = name_selector(last_name_list)
name = first_name_selected " " last_name_selected
return name
現在我認為我仍然需要做的唯一一件事就是從類中生成名稱NPC。我想這樣做:
def name_gen
if gender == "M":
name = name_builder("first_name_male.txt", "last_name.txt")
elif gender == "F":
name = name_builder("first_name_female.txt", "last_name.txt")
但我不明白如何讓name_gen函式檢查class NPC屬性,以便生成所需的名稱。
有人可以幫助我嗎?
編輯
Thank you for all the solutions! I am pretty new to Python; In order to test Samwises solution, I tried to run it as a separate script (in order to check whether I would get a name) with the code below. It does however not print anything. I'm putting this in an EDIT because I think it might be a trivial question. If it is worth posting a separate question, please let me know:
import random
running = True
npc_input_messsage = "npc = NPC(25, 'M')"
class NameChooser:
def __init__(self, file_path):
with open(file_path) as f:
self._names = f.read().splitlines()
def choice(self):
return random.choice(self._names)
first_choosers = {
"M": NameChooser("first_name_male.txt"),
"F": NameChooser("first_name_female.txt"),
}
last_chooser = NameChooser("last_name.txt")
def name_gen(gender):
return f"{first_choosers[gender].choice()} {last_chooser.choice()}"
class NPC:
def __init__(self, age, gender):
self.name = name_gen(gender)
self.age = age
self.gender = gender
while running:
npc = input(npc_input_messsage)
# I'm entering npc = NPC(25, "M")
print(npc)
uj5u.com熱心網友回復:
您的名稱生成器有點過于復雜 IMO。我建議將所有檔案讀取和名稱選擇內容包裝在一個簡單的類中,這樣您就可以定義一次,然后為每個名稱串列實體化它。放入檔案讀取部分__init__意味著您只需在每個串列中執行一次,而不是在每次需要選擇名稱時重新讀取檔案。
import random
class NameChooser:
def __init__(self, file_path):
with open(file_path) as f:
self._names = f.read().splitlines()
def choice(self):
return random.choice(self._names)
現在您可以定義三個NameChoosers 和一個從中name_gen挑選的函式:
first_choosers = {
"M": NameChooser("first_name_male.txt"),
"F": NameChooser("first_name_female.txt"),
}
last_chooser = NameChooser("last_name.txt")
def name_gen(gender):
return f"{first_choosers[gender].choice()} {last_chooser.choice()}"
現在您可以定義一個NPC將age和gender作為建構式的引數的類,并使用以下方法選擇一個隨機名稱name_gen():
class NPC:
def __init__(self, age, gender):
self.name = name_gen(gender)
self.age = age
self.gender = gender
def __str__(self):
return f"{self.name} ({self.age}/{self.gender})"
npc = NPC(25, "M")
print(npc) # prints "Bob Small (25/M)"
uj5u.com熱心網友回復:
我認為您對 OOP 概念感到困惑。
首先,讓我們編輯您的課程:
class NPC:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
看,我已經為屬性分配了引數值。現在讓我們更改您的函式:
def name_gen(gender):
if gender == "M":
name = name_builder("first_name_male.txt", "last_name.txt")
elif gender == "F":
name = name_builder("first_name_female.txt", "last_name.txt")
return name
在這里,我在您的函式中添加了一個引數,因為您正在使用它的值。現在讓我們為您的類創建一個實體。
npc = NPC("Vishwas", 25, "M") # Instance of the class
print(name_gen(npc.gender)) # Print generated name
uj5u.com熱心網友回復:
一種自動發生的直接方法是簡單地使用該NPC.__init__()方法呼叫名稱生成器。在下面的代碼中,它通過使用下劃線字符開始其名稱而成為該類的私有方法。請注意,對它的呼叫必須等到它參考的所有實體屬性都被賦值。
from random import randrange
class NPC:
def __init__(self, age, gender):
self.age = age
self.gender = gender
self.name = self._name_gen()
def _name_gen(self):
if self.gender == "M":
name = name_builder("first_name_male.txt", "last_name.txt")
elif self.gender == "F":
name = name_builder("first_name_female.txt", "last_name.txt")
return name
def line_appender(file_path, target):
file = open(file_path, "r")
splitfile = file.read().splitlines()
for line in splitfile:
target.append(line)
def name_selector(target_list):
selected = target_list[randrange(len(target_list))]
return selected
def name_builder(first_name_list_path, last_name_list_path):
first_name_list = []
last_name_list = []
line_appender(first_name_list_path, first_name_list)
line_appender(last_name_list_path, last_name_list)
first_name_selected = name_selector(first_name_list)
last_name_selected = name_selector(last_name_list)
name = first_name_selected " " last_name_selected
return name
if __name__ == '__main__':
npc1 = NPC(25, 'M')
print(f'{npc1.name!r}')
npc2 = NPC(21, 'F')
print(f'{npc2.name!r}')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438309.html
上一篇:module.exports中的函式“不是函式”?-節點
下一篇:ForLoop計數不正確
