2015-06-21 28 views
0

爲個人姓名,地址,電話和電子郵件編寫一個名爲Person的類,其中包含數據屬性。接下來,編寫一個名爲Customer的類,該類是Person類的子類。客戶類應該有一個客戶編號的數據屬性和一個布爾數據屬性,表明客戶是否希望成爲郵件列表中的一員。在一個簡單的程序中演示一個Customer類的實例。屬性錯誤人員和客戶類別

我得到一個attibute錯誤。

, line 6, in main 
    '555-987-1549','[email protected]','Y','1153') 
TypeError: __init__() takes 5 positional arguments but 7 were given 

我不完全遵循使用布爾表達式,所以也許有人可以解釋爲什麼它正在使用,並幫助我,爲什麼我收到這個錯誤的地步。

繼承人我的代碼

Person

class Person: 
    def __init__(self, name, address, telephone, email): 
     self.__name = name 
     self.__address = address 
     self.__telephone = telephone 
     self.__email = email 

    def set_name(self, name): 
     self.__name = name 

    def set_address(self, address): 
     self.__address = address 

    def set_telephone(self, telephone): 
     self.__telephone = telephone 

    def set_email(self, email): 
     self.__email = email 

    def get_name(self): 
     return self.__name 

    def get_address(self): 
     return self.__address 

    def get_telephone(self): 
     return self.__telephone 

    def get_email(self): 
     return self.__email 

Customer

import Person 

class Customer(Person.Person): 
    def __init__(self, name, address, telephone, email): 
     Person.Person.__init__(self, mail, number) 
     self.mailing = 'Y'== True 
     self.__mail = mail 
     self.__number = number 

    def set_mail(self, mail): 
     self.__mail = mail 

    def set_number(self, number): 
     self.__number = number 

    def get_mail(self): 
     return self.__mail 

    def get_number(self): 
     return self.__number 

    def mailList(self, mail): 
     if mailing == True: 
      return"On the mailing list" 
     else: 
      return"Not on the mailing list" 

    def __str__(self): 
     return "\nName: {}\nAddress: {}\ntelephone: {}\nEmail: {}\nMail: {}\nNumber: {}".\ 
      format(self.get_name(), self.get_address(),\ 
        self.get_telephone(), self.get_email()\ 
        , self.mailList(self.get_mail()),self.get_number()) 

customerTest

import Customer 

def main(): 

    customer = Customer.Customer('Josh', 'Long st, Dallas TX',\ 
           '555-987-1549','[email protected]','Y','1153') 
    print(customer) 

main() 
+1

你調用'Customer'有6個參數,然後調用'Person'有兩個參數(兩者都沒有定義,由方式) ,但是這兩個構造函數都需要4個參數,緊挨着'self'。另外,'self.mailing ='Y'== True'沒有多大意義。 –

回答

0

__init__構造函數in`客戶不正確,參數個數不正確。

self.mailing你可能想TrueFalse根據論點。

def __init__(self, name, address, telephone, mail, mailing, number): 
     Person.Person.__init__(self, name, address, telephone, mail) 
     self.mailing = True if mailing == 'Y' else False 
     self.__mail = mail 
     self.__number = number 

另外mailList需要用self來引用當前對象。

def mailList(self, mail): 
     if self.mailing == True: 
      return"On the mailing list" 
     else: 
      return"Not on the mailing list" 
+0

謝謝我幾乎可以使用它。但郵件總是在郵件列表中返回Not,你知道它是什麼,我使用了你給我的代碼。 – keggy

+0

Nevermind得到它感謝您的幫助 – keggy

1

貌似而非

def __init__(self, name, address, telephone, email): 

你實際上意味着:

def __init__(self, name, address, telephone, email, mail, number): 

順便說一句,這是怎麼回事?

self.mailing = 'Y'== True 

你大概的意思

self.mailing = mail == True 

編輯:是的,有什麼託拜厄斯說。此外

Person.Person.__init__(self, mail, number) 

而這是沒有必要的,you might want to使用super().(...)語法而不是直接調用Person.__init__(self, ...) - 請修正這個問題,以及包括缺少的參數。

+1

...並且還需要修復對超級構造函數和'mailList'方法的調用...... –

0

對於Person類以及是否使用Python2。7,把它定義爲從Object類繼承,以便能夠正確以後使用super表達,當你從這個類否則,如果你處理Python3 +內在,你就可以說super().__init__(),所以:

Person類將是:

class Person(object):#only change 
    def __init__(self, name, address, telephone, email): 
     self.__name = name 
     self.__address = address 
     self.__telephone = telephone 
     self.__email = email 

    def set_name(self, name): 
     self.__name = name 

    def set_address(self, address): 
     self.__address = address 

    def set_telephone(self, telephone): 
     self.__telephone = telephone 

    def set_email(self, email): 
     self.__email = email 

    def get_name(self): 
     return self.__name 

    def get_address(self): 
     return self.__address 

    def get_telephone(self): 
     return self.__telephone 

    def get_email(self): 
     return self.__email 

至於客戶類,閱讀代碼的註釋,我做了改變

import Person 

class Customer(Person.Person): 
    def __init__(self, name, address, telephone, email, mail, number): #fixed number of arguments to pass for class instantiation 
     super(type(self), self).__init__(name, address, telephone, email) #Also here and not the use of `super` 
     #super().__init__(name, address, telephone, email) with Python 3+ 
     self.mailing = True if mail == 'Y' else False #Fixed self.mailing expression 
     self.__mail = mail 
     self.__number = number 

    def set_mail(self, mail): 
     self.__mail = mail 

    def set_number(self, number): 
     self.__number = number 

    def get_mail(self): 
     return self.__mail 

    def get_number(self): 
     return self.__number 

    def mailList(self): #No need for mail argument 
     if self.mailing == True: #Just Check here self.mailing 
      return "On the mailing list" 
     else: 
      return "Not on the mailing list" 

    def __str__(self): 
     return "\nName: {}\nAddress: {}\ntelephone: {}\nEmail: {}\nMail: {}\nNumber: {}".\ 
       format(self.get_name(), self.get_address(),\ 
         self.get_telephone(), self.get_email()\ 
         , self.mailList(),self.get_number())