【问题标题】:Inheritance in Python: missing 1 required positional argument: 'self'Python 中的继承:缺少 1 个必需的位置参数:'self'
【发布时间】:2018-09-16 01:19:39
【问题描述】:

我有以下课程:

模型.py

from priceChecker.priceChecker import db

class Model():

    def __init__(self, tableName):
        self.__tablename__ = tableName

    def getAll(self): #, conditions=[]
        try:
            print('Executing query for table: ' + self.__tablename__)
            result = db.execute("SELECT * FROM " + self.__tablename__)
            return result
        except ValueError:
            print("Oops, something went wrong sucker!...")

和 item.py

from priceChecker.core.models.model import Model

class Item(Model):

    def __init__(self):
        print('\n\nInitializing Item model...')
        super().__init__('orders')

    def getAllItems(self):
       items = Model.getAll()
       return items

我的控制器 ItemController.py

from priceChecker.core.models.item import Item

class ItemController:

    def __init__(self):
        self.item = Item()

    def retrieveItems(self):
        #allItms = 'a'
        allItms = self.item.getAllItems()
        return allItms

运行此程序时,我收到以下错误:

builtins.TypeError TypeError: getAll() missing 1 required positional 参数:“自我”

我可以通过在 item.py 中将 self 添加到这个调用中来解决它:

items = Model.getAll(self)

但我的问题是:为什么我必须将 self 作为参数传递?由于它是从模型扩展而来的,有没有办法在不传递 self 的情况下调用 getAll?

【问题讨论】:

  • items = Model.getAll() 更改为items = self.getAll()。您的解决方案不够用
  • 调用基类的方法和调用你自己的方法是一样的——ItemModel,所以你可以用self.getAll()来调用继承的getAll方法。
  • 在幕后,self.getAll()type(self).getAll(self) 做几乎相同的事情——但第一个显然更短,更清晰,而且在细微的不同之处,它几乎总是正确的一。

标签: python python-3.x


【解决方案1】:

如果你直接从类对象访问一个函数,那么它实际上不是一个方法,它只是一个函数,你必须传递你在函数定义的签名中指定的参数,否则,就像任何其他函数,它会引发错误。只有当你通过实例访问函数时,descriptor protocol 才会被启动,将实例绑定到方法,本质上返回一个新的部分应用函数,一个绑定方法对象。所以,你需要这样做:

items = self.getAll()

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2023-02-06
    • 2021-09-15
    • 2013-07-06
    • 2022-01-05
    相关资源
    最近更新 更多