【问题标题】:beginner python: nested classes and loading data into them初学者python:嵌套类并将数据加载到其中
【发布时间】: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 来引用它

标签: python class


【解决方案1】:

您的内部类 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    相关资源
    最近更新 更多