Не получается вызвать статический метод класса в 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'. Как мне это исправить?
Ответы (2 шт):
Первый вариант — вместо статического метода используйте самостоятельную функцию. Для того
Удалите строку
@staticmethodВместо параметра
self(который вам нужен только для определения, с которой датабазой вы хотите работать), примените прямо параметрdbdef 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_(имя_датабазы).
По-моему, в данном случае может подойти метод класса (@classmethod):
class Topic:
db = None
def __init__(self, db):
Topic.db = db
@classmethod
def select_all(cls):
if cls.db:
return f'Все данные из: {cls.db}'
else:
return 'Вы не указали БД'
print(Topic.select_all())
print(Topic('БазаДанных').select_all())
Вы не указали БД
Все данные из: БазаДанных