简体   繁体   中英

Python Troubles (Missing 1 required positional argument: 'self')

i'm trying to solve the adventofcode riddles, but this year i decided to take the chance to learn a new programming language: Python. Since i already have some knowledge about other OOP languages like Java and C++, i immediately created an "interface" system for the Solutions objects.

My project setup at the moment is like:

Project Setup

Now what i want is to dynamically output solutions through the main class, that basically has to call all.solve() method of each dayX.py class that is in the /solutions/ directory .

I think i'm next to do it but i get an error:

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'

Here are my files:

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()))

day1.py

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"

When you're using the getattr on the imported module, you're getting the class definition. Methods are only callable on class instances, otherwise they throw the error you're seeing:

class A:
    def a(self):
        pass

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

Changing the __main__ part this way should solve the issue:

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())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM