-1

I am learning python.I got this error p1.setFirstName("john") AttributeError: 'User' object has no attribute 'setFirstName' I am not getting where I did mistake.please help me to solve this error.I am lerning setter and getter method.I called the method below but it showing its not attribute.so I am confused what it means. Thank you.

User.py

import mysql.connector
class User:
  def __init__(self):

      def setFirstName(self,new_firstname):
          self._FirstName = new_firstname

      def setLastName(self,new_lastname):
          self._LastName = new_lastname

      def setBirthdate(self,new_birthdate):
          self._Birthdate = new_birthdate

      def setMartialStatus(self,new_martialstatus):
          self._MartialStatus = new_martialstatus

      def setGender(self,new_gender):
          self._Gender = new_gender

      def setHeight(self,new_height):
          self._Height = new_height

      def setValidIdType(self,new_valididtype):
          self._ValidIdType = new_valididtype

      def setValidIdNumber(self,new_valididnumber):
          self._ValidIdNumber = new_valididnumber

      def setNationality(self,new_nationality):
          self._Nationality = new_nationality

      def getFirstName():
          return self._FirstName

      def getLastName():
          return self._LastName

      def getBirthdate():
          return self._Birthdate

      def getMartialStatus():
          return self._MartialStatus

      def getGender():
          return self._Gender

      def getHeight():
          return self._Height

      def getValidIdType():
          return self._ValidIdType

      def getValidIdNumber():
          return self._ValidIdNumber

      def getNationality():
          return self._Nationality


p1=User()
p1.setFirstName("john")
p1.setLastName("abrahum")
p1.setBirthdate("1/1/1996")
p1.setMartialStatus("married")
p1.setGender("male")
p1.setHeight("5ft2inhces")
p1.setValidIdType("pancard")
p1.setValidIdNumber("123456")
p1.setNationality("Indian")

name=p1.getFirstName()
print(name)
Vinit Mapari
  • 439
  • 3
  • 7
  • 15
  • 1
    Did you come to python from another language? – Skam Jul 22 '18 at 07:27
  • according to the indentation, all methods are defined inside `__init__`. So they cannot be accessed from the instance level – PRMoureu Jul 22 '18 at 07:27
  • yes I come to python from java and php .Thanks for your help but if I want to write as per previous code that I mentioned in question then I need to defined all methods outside_init_ and if I accessed these method then how will I accessed it? – Vinit Mapari Jul 22 '18 at 07:44

2 Answers2

2

Consider the smaller example,

class Dog:
    def __init__(self):
        def bark():
            print("Woof!")

This is valid Python and works just fine but is not what you intended. The function bark only lives within the scope of the __init__ function which you can think of as the constructor for the class Dog. In order to the get dog to bark, you would need to do.

class Dog:
    def __init__(self):
        def bark():
            print("Woof!")
        bark()

In your case, I think you meant to do.

class User:
    def __init__(self):
        # set this first in case the user
        # tries to `get` before setting
        self.first_name = ''

    def set_first_name(self, name):
        self.first_name = name

    def get_first_name(self):
        return self.first_name

Note, the convention of python is to use snake case instead of camel case. I would also look at this post on python @property vs getters and setters if you're concerned with best practices in that domain!

Skam
  • 7,298
  • 4
  • 22
  • 31
1

1 - all your methods are defined under __init__

2 - your getters must take self as parameter

class User:

    def setFirstName(self, new_firstname):
        self._FirstName = new_firstname

    def setLastName(self, new_lastname):
        self._LastName = new_lastname

    def setBirthdate(self, new_birthdate):
        self._Birthdate = new_birthdate

    def setMartialStatus(self, new_martialstatus):
        self._MartialStatus = new_martialstatus

    def setGender(self, new_gender):
        self._Gender = new_gender

    def setHeight(self, new_height):
        self._Height = new_height

    def setValidIdType(self, new_valididtype):
        self._ValidIdType = new_valididtype

    def setValidIdNumber(self, new_valididnumber):
        self._ValidIdNumber = new_valididnumber

    def setNationality(self, new_nationality):
        self._Nationality = new_nationality

    def getFirstName(self):
        return self._FirstName

    def getLastName(self):
        return self._LastName

    def getBirthdate(self):
        return self._Birthdate

    def getMartialStatus(self):
        return self._MartialStatus

    def getGender(self):
        return self._Gender

    def getHeight(self):
        return self._Height

    def getValidIdType(self):
        return self._ValidIdType

    def getValidIdNumber(self):
        return self._ValidIdNumber

    def getNationality(self):
        return self._Nationality


if __name__ == '__main__':
    p1 = User()
    p1.setFirstName("john")
    p1.setLastName("abrahum")
    p1.setBirthdate("1/1/1996")
    p1.setMartialStatus("married")
    p1.setGender("male")
    p1.setHeight("5ft2inhces")
    p1.setValidIdType("pancard")
    p1.setValidIdNumber("123456")
    p1.setNationality("Indian")

    name = p1.getFirstName()
    print(name)

However, in python, you can advantageously replace all these getters and setters with:

class User:

    def __init__(self):

        self.first_name = None
        self.last_name = None
        self.birth_date = None
        self.marital_status = None
        self.gender = None
        self.height = None
        self.valid_id_tyoe = None
        self.valid_id_number = None
        self.nationality = None


if __name__ == '__main__':
    p1 = User()
    p1.first_name = "john"
    p1.last_name = "abrahum"
    p1.birth_date = "1/1/1996"
    p1.marital_status = "married"
    p1.gender = "male"
    p1.height = "5ft2inhces"
    p1.valid_id_type = "pancard"
    p1.valid_id_number = "123456"

    name = p1.first_name
    print(name)
Reblochon Masque
  • 35,405
  • 10
  • 55
  • 80