初学者python:嵌套类并将数据加载到它们中

时间:2018-10-20 21:49:12

标签: python class

我是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作为嵌套类,我可以使它起作用,但是否则,我遇到了麻烦。感谢所有输入;谢谢您的时间。

1 个答案:

答案 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)