我是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作为嵌套类,我可以使它起作用,但是否则,我遇到了麻烦。感谢所有输入;谢谢您的时间。
答案 0 :(得分:0)
您的内部类TrainerData
似乎需要3个参数trainername, battle, winnings
,这些参数在类__init__
中作为参数列出。
但是,您试图在主类中创建没有任何参数的TrainerData
对象
self.trainerdata = self.TrainerData()
这实际上触发了您的问题。您需要为此嵌套类提供3个参数。
self.trainerdata = self.TrainerData('John', 'StackOverflow', +10)
顺便说一句,您还可以为__init__
函数指定默认参数:
class TrainerData:
def __init__(self, trainername="nobady", battle="any", winnings=0):
self.trainername = trainername
self.battle = battle
self.winnings = winnings
在这种情况下,您实际上可以创建不带参数的此类的对象。它将为任何遗漏的参数设置默认参数。例如,在这种情况下,以下所有内容都可以完美运行
self.trainerdata = self.TrainerData()
self.trainerdata = self.TrainerData(trainername="John")
self.trainerdata = self.TrainerData(trainername="John", battle="StackOverflow")
self.trainerdata = self.TrainerData(trainername="John", winnings=100)