Skip to content
Advertisement

AttributeError: ‘AnimalShelter’ object has no attribute ‘database’

I am not understanding why I am receiving this error as my .py file indicates that database is in fact an attribute. I have made sure that everything is indented as it should be and made sure that the correct .py is notated when importing AnimalShelter. I am following a walkthrough for this for class and the .ipynb definitely details everything as is it is in the walkthrough so there has to be something wrong with the .py file. I just dont understand what…

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)
<ipython-input-11-2eb0b77f93e5> in <module>
     23 shelter = AnimalShelter()
     24 # class read method must support return of cursor object and accept projection json input
---> 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:
---> 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)
<ipython-input-1-fdaad3d4f048> in <module>
     21 username = "aacuser"
     22 password = "monogoadmin"
---> 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):
----> 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

Advertisement

Answer

You need to change _init_ to __init__:

Change

#Initializes MongoClient
def _init_(self, username, password):
    self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password))
    self.database = self.client['project']

to

#Initializes MongoClient
def __init__(self, username, password):
    self.client = MongoClient('mongodb://127.0.0.1:38574' % (username, password))
    self.database = self.client['project']  

When you call AnimalShelter(...), Python tries to call __init__ if it exists, and if it doesn’t, it uses a default implementation. It doesn’t automatically call _init_.

Therefore, self.database = self.client['project'] is never executed, so AnimalShelter doesn’t have a database attribute, which is the cause of your error.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement