Ошибка атрибута: объект «AnimalShelter» не имеет атрибута «база данных»

#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 атрибута, который является причиной вашей ошибки.