#python #pandas #mongodb #attributes #jupyter
Вопрос:
Я не понимаю, почему я получаю эту ошибку, так как мой файл .py указывает, что база данных на самом деле является атрибутом. Я убедился, что все с отступом, как и должно быть, и убедился, что при импорте AnimalShelter указан правильный .py. Я следую пошаговому руководству для этого класса, и .ipynb определенно подробно описывает все, как есть, в пошаговом руководстве, поэтому с файлом .py должно быть что-то не так. Я просто не понимаю, что именно…
from jupyter_plotly_dash import JupyterDash import dash import dash_leaflet as dl import dash_core_components as dcc import dash_html_components as html import plotly.express as px import dash_table from dash.dependencies import Input, Output import numpy as np import pandas as pd import matplotlib.pyplot as plt from pymongo import MongoClient #### FIX ME ##### # change animal_shelter and AnimalShelter to match your CRUD Python module file name and class name from AAC import AnimalShelter ########################### # Data Manipulation / Model ########################### # FIX ME update with your username and password and CRUD Python module name username = "aacuser" password = "monogoadmin" shelter = AnimalShelter(username, password) # class read method must support return of cursor object and accept projection json input df = pd.DataFrame.from_records(shelter.read({})) print (df)
import pymongo from pymongo import MongoClient from bson.objectid import ObjectId class AnimalShelter(object): """CRUD operations for Animal collection in Mongodatabase""" #Initializes MongoClient def _init_(self, username, password): self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password)) self.database = self.client['project'] #Implement create method def create(self, data): if data is not None: return self.database.animals.insert_one(data) else: raise Exception("Nothing to save, because data parameter is empty") #Implement read method def read(self, data): if data is not None: return self.database.animals.find(data) else: raise Exception("Nothing to read, because data parameter is empty") #Implement update method def update(self, data): if find is not None: return self.database.animals.update_one(data) else: raise Exception("Nothing to update, because data parameter is empty") #Implement delete method def delete(self, data): if data is not None: return self.database.animals.delete_one(data) else: raise Exception("Nothing to delete, because data parameter is empty")
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) lt;ipython-input-11-2eb0b77f93e5gt; in lt;modulegt; 23 shelter = AnimalShelter() 24 # class read method must support return of cursor object and accept projection json input ---gt; 25 df = pd.DataFrame.from_records(shelter.read({})) 26 27 print (df) ~/Desktop/AAC.py in read(self, data) 18 def read(self, data): 19 if data is not None: ---gt; 20 return self.database.animals.find(data) 21 else: 22 raise Exception("Nothing to read, because data parameter is empty") AttributeError: 'AnimalShelter' object has no attribute 'database'
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) lt;ipython-input-1-fdaad3d4f048gt; in lt;modulegt; 21 username = "aacuser" 22 password = "monogoadmin" ---gt; 23 shelter = AnimalShelter(username, password) 24 # class read method must support return of cursor object and accept projection json input 25 df = pd.DataFrame.from_records(shelter.read({})) ~/Desktop/AAC.py in __init__(self, username, password) 7 #Initializes MongoClient 8 def __init__(self, username, password): ----gt; 9 self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password)) 10 self.database = self.client['project'] 11 #Implement create method TypeError: not all arguments converted during string formatting
Комментарии:
1. Не могли бы вы опубликовать полный ответ в своем вопросе, а не только сообщение об ошибке?
Ответ №1:
Вам нужно переодеться _init_
, чтобы __init__
:
Изменить
#Initializes MongoClient def _init_(self, username, password): self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password)) self.database = self.client['project']
Для
#Initializes MongoClient def __init__(self, username, password): self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password)) self.database = self.client['project']
Когда вы звоните AnimalShelter(...)
, Python пытается позвонить __init__
, если он существует, а если нет, он использует реализацию по умолчанию. Он не звонит автоматически _init_
.
Следовательно, self.database = self.client['project']
никогда не выполняется, поэтому AnimalShelter
не имеет database
атрибута, который является причиной вашей ошибки.