【问题标题】:Attribute Error Person and customer classes属性错误人员和客户类
【发布时间】:2015-06-21 13:58:52
【问题描述】:

编写一个名为 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()

【问题讨论】:

  • 您使用 6 个参数调用 Customer,然后使用两个参数调用 Person(顺便说一句,两者都没有定义),但是这两个构造函数都需要 4 个参数,在 self 旁边.另外,self.mailing = 'Y'== True 没有多大意义。

标签: python


【解决方案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, ...)

【讨论】:

  • ...并且还需要修复对超级构造函数和mailList方法的调用...
【解决方案2】:

__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"

【讨论】:

  • 谢谢,我几乎可以使用它了。但是邮件总是返回 不在邮件列表中你知道我用你给我的代码可能是什么。
【解决方案3】:

对于 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

对于客户类,请阅读我进行更改的代码 cmets

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多