python初学者:嵌套类并向其中加载数据

python初学者:嵌套类并向其中加载数据,python,class,Python,Class,我对pythonweb开发(以及面向对象编程)是新手。我的数据库中有一个视图,它由7个“部分”组成,我想将它们划分为自己的类(尽管数据在我的数据库中是“连接的”)。零件/类别将为TrainerData、Pokemon1、Pokemon2等 这是我想要的一个更简单的版本。我知道问题和错误,我只是不知道如何解决这个问题。这是我到目前为止所拥有的 import psycopg2 class Trainer: def __init__(self): self.trainerda

我对pythonweb开发(以及面向对象编程)是新手。我的数据库中有一个视图,它由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'
回溯(最近一次呼叫最后一次):
文件“C:/Users/ageeray/Documents/Python Scripts/PokeTrainerWeb/trainer.py”,第22行,在
a=培训师()
文件“C:/Users/ageeray/Documents/Python Scripts/PokeTrainerWeb/trainer.py”,第5行,在__
self.trainerdata=self.trainerdata()
TypeError:\uuuu init\uuuuu()缺少3个必需的位置参数:“trainername”、“battle”和“winnings”

如果我没有将TrainerData作为嵌套类,我可以让它工作,但是,否则,我就遇到了麻烦。感谢所有的投入;谢谢您的时间。

您的内部类
TrainerData
似乎需要3个参数
trainername、battle、winnings
,您将它们列为类
\uuuu init\uuuu>函数中的参数

但是,您正在尝试在主类中创建一个不带任何参数的
TrainerData
对象

self.trainerdata=self.trainerdata()

这实际上引发了你的问题。您需要为此嵌套类提供3个参数

self.trainerdata = self.TrainerData('John', 'StackOverflow', +10)
顺便说一句您还可以为
\uuuuu init\uuuu
函数指定默认参数:

   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)

回溯中显示的代码与上面的代码不匹配。请告诉我们您实际运行的代码及其产生的错误消息。它应该是
a=Trainer(Trainer.TrainerData.load\u from\u db\u by_tname('angus'))
,但我发现不管怎样使用嵌套类都很奇怪,为什么这在这里有用?@WillemVanOnsem tbh,我不太确定。我只是认为这是组织我的课程的合乎逻辑的方式,但也许我错了。我想我可以将嵌套类分解为它们自己的非嵌套类,但我不确定如何使它们“连接”//相互依赖。不,嵌套类在Python中很少有用。这里的类的工作原理完全相同,只是不能用
self