簡體   English   中英

屬性錯誤人員和客戶類別

[英]Attribute Error Person and customer classes

編寫一個名為Person的類,該類具有用於數據顯示其姓名,地址,電話和電子郵件的屬性。 接下來,編寫一個名為Customer的類,它是Person類的子類。 Customer類應具有一個客戶編號的數據屬性和一個布爾數據屬性,該屬性指示客戶是否希望成為郵件列表中的一個。 在一個簡單程序中演示Customer類的實例。

我收到了裝箱錯誤。

, line 6, in main
    '555-987-1549','adsf@asd.com','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','adsf@asd.com','Y','1153')
    print(customer)

main()

看起來像而不是

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)

另外,雖然沒有必要,但您可能想使用super().(...)語法,而不是直接調用Person.__init__(self, ...)

客戶中的__init__構造函數不正確,參數數量不正確。

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"

對於Person類,如果您使用的是Python2.7,請將其定義為從Object類繼承,以便稍后在您從此類繼承時可以正確使用super表達式,否則,如果您使用Python3 +,則可以說super().__init__() ,因此:

人員類別將是:

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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM