【发布时间】:2018-10-21 09:25:21
【问题描述】:
我是 python web 开发的新手(和一般的 OOP)。我的数据库中有一个视图,它由 7 个“部分”组成,我想将它们分成自己的类(尽管数据在我的数据库中是“加入”的)。零件/类将是 TrainerData、Pokemon1、Pokemon2 等......
这是我想要的更简单的版本。我知道问题和错误,我只是没有解决这个问题的知识。这是我目前所拥有的。
import psycopg2
class Trainer:
def __init__(self):
self.trainerdata = self.TrainerData()
class TrainerData:
def __init__(self, trainername, battle, winnings):
self.trainername = trainername
self.battle = battle
self.winnings = winnings
@classmethod
def load_from_db_by_tname(cls, tname):
with psycopg2._connect(user='postgres', password='samfurdissamrea', database='ODS', host='localhost') as connection:
with connection.cursor() as cursor:
cursor.execute('SELECT trainer_name, battle, winnings from public.poke_data_web WHERE lower(trainer_name) = lower(%s)', (tname,))
trainer_data = cursor.fetchone()
return cls(trainername=trainer_data[0], battle=trainer_data[1], winnings=trainer_data[2])
a = Trainer()
print(a.trainerdata.load_from_db_by_tname('angus'))
返回的错误:
Traceback (most recent call last):
File "C:/Users/ageeray/Documents/Python Scripts/PokeTrainerWeb/trainer.py", line 22, in <module>
a = Trainer()
File "C:/Users/ageeray/Documents/Python Scripts/PokeTrainerWeb/trainer.py", line 5, in __init__
self.trainerdata = self.TrainerData()
TypeError: __init__() missing 3 required positional arguments: 'trainername', 'battle', and 'winnings'
如果我没有将 TrainerData 作为嵌套类,我可以让它工作,但否则,我就碰壁了。感谢所有输入;谢谢你的时间。
【问题讨论】:
-
回溯中显示的代码与上面的代码不匹配。请向我们展示您实际运行的代码及其产生的错误消息。
-
应该是
a = Trainer(Trainer.TrainerData.load_from_db_by_tname('angus')),但是我觉得你用嵌套类还是很奇怪的,为什么在这里有用? -
@WillemVanOnsem tbh,我不太确定。我只是认为这将是组织我的课程的合乎逻辑的方式,但也许我错了。我想我可以将嵌套类分解成它们自己的非嵌套类,但我不确定如何让它们“加入”/相互依赖。
-
不,嵌套类在 Python 中很少有用。你的类在这里的工作方式完全相同,只是你不会用
self来引用它