Не получается вызвать статический метод класса в python
Класс topic, с вызовом метода из которого у меня возникают проблемы:
#.tools - where definded get_current_time, generate_id
#db is object of class and have method excute_query, wich send query to
from .tools import *
class topic:
def __init__(self,theme,author,about,db):
self.time_of_creation = get_current_time
self.theme = theme
self.author = author
self.about = about
self.sb_id = generate_id()
self.db = db
try:
#inserting data into DB
self.db.excute_query(f"""INSERT INTO user VALUES ("{get_current_time()}, '{self.theme}',
'{self.author}','{self.about}',
'{generate_id()}')""")
return 1
except Exception as e:
print(str(e))
return [0, str(e)]
@staticmethod
def all(self):
return self.db.excute_query("SELECT * FROM topic")
Я пытаюсь вызвать метод all():
topic.all()
и в ответ получаю AttributeError: 'function' object has no attribute 'all'. Как мне это исправить?
Первый вариант — вместо статического метода используйте самостоятельную функцию. Для того
- Удалите строку
@staticmethod
- Вместо параметра
self(который вам нужен только для определения, с которой датабазой вы хотите работать), примените прямо параметрdb
def all_(db):
- Обратите внимание на то, что вместо имени
allя применил имяall_, т.к.allявляется именем стандартной функции Питона. - Удалите отступ перед этим определением функции — вам не нужно, чтобы она была связана с вашим классом
topic, и соответственно уменьшите отступ следующей команды. Ну и в этой команде удалите частьself.и вместоtopicпримените имя вашей таблицы — из вашего кода я гадаю, что оноuser:
def all_(db):
return db.excute_query("SELECT * FROM user")
Затем вы можете вызывать эту функцию в виде all_(имя_датабазы).
Второй вариант — исправите ваш статический метод. Для того отбросите self, т.к. статический метод не знает ничего ни об объекте, ни о классе. Значит,
вместо
@staticmethod
def all(self):
return self.db.excute_query("SELECT * FROM topic")
используйте
@staticmethod
def all_(db):
return db.excute_query("SELECT * FROM user")
Затем вы можете вызывать этот метод в виде topic.all_(имя_датабазы).