Python问题(缺少1个必需的位置参数:“self”)

2024-04-20 06:08:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图解开adventofcode之谜,但今年我决定抓住机会学习一种新的编程语言:Python。 由于我已经了解了其他的OOP语言,如java和C++,所以我立即为解决方案对象创建了一个“接口”系统。p>

我目前的项目设置如下:

Project Setup

现在我想要的是通过主类动态输出解决方案,它基本上必须调用/solutions/目录中每个dayX.py类的all.solve()方法

我想我是下一个要做的人,但我犯了一个错误:

Traceback (most recent call last):
  File "C:\Users\siste\j-workspace\adventofcode2020\main.py", line 16, in <module>
    print(solution.solve())
TypeError: solve() missing 1 required positional argument: 'self'

这是我的档案:

main.py

import os

def days():
   classes = []
   path = "C:\\path"

   for file in os.listdir(path):
      if(file.startswith("day")) :
        classes.append(str(file.replace(".py", "")))

   return classes
    
if __name__ == '__main__':
    for day in days() :
        solution = getattr(__import__(str("solutions." + day)), day.replace("d", "D"))
        print(solution.solve())

solution.py

path = "C:\\path\\inputs\\day{}.txt"

class Solution:

  def __init__(self, dayNumber):
      self.dayNumber = dayNumber
      self.inputPath = path.format(self.dayNumber)

  def part1(self):
      pass

  def part2(self):
      pass
     
  def solve(self):
      return ("Day {} Solutions: \n\tPart1: {}\n\tPart2: {}"
          .format(self.dayNumber, self.part1(), self.part2()))

第1天

import fileinput
from solutions.solution import Solution

class Day1(Solution):

  def __init__(self):
      super().__init__(1)

  def part1(self):
      return "sol"
        
  def part2(self):
      return "sol2"

Tags: pathinpyimportselfreturnmaindef
1条回答
网友
1楼 · 发布于 2024-04-20 06:08:54

在导入的模块上使用getattr时,将获得类定义。方法只能在类实例上调用,否则会抛出您看到的错误:

class A:
    def a(self):
        pass

A.a()   // Will throw "TypeError: a() missing 1 required positional argument: 'self'"
A().a() // OK

以这种方式更改__main__部分可以解决以下问题:

if __name__ == '__main__':
    for day in days() :
        day_class = getattr(__import__(str("solutions." + day)), day.replace("d", "D"))
        day_instance = day_class()
        print(day_instance.solve())

相关问题 更多 >