python类函数错误

时间:2018-04-11 16:17:59

标签: python oop

我是一个python新手,我正在尝试使用OOP方式编写简单的项目。

第一个函数等待用户界面输入用户名。

第二个功能等待用户界面输入用户的姓氏。

THEN

第三个函数打印全名。

但是

当我尝试启动这些功能时,它会给我带来错误。

以下是代码:

class UserFullName:
    def __init__(self, FirstName, LastName, FullName):
        self.FirstName = FirstName
        self.LastName = LastName
        self.FullName = FullName


    def FirstName(self):
        FirstName = input("enter your first name:\n".title())
        return FirstName

    def LastName(self):
        LastName = input("enter your last name:\n".title())
        return LastName

    def FullName(self, FirstName, LastName):
        print('welcome', "{} {}".format(FirstName, LastName).title())
        return

UserFullName.FirstName()
UserFullName.LastName()
UserFullName.FullName()

这是错误:

追踪(最近一次呼叫最后一次):

文件“E:/Tutorial/pan.py”,第20行,

UserFullName.FirstName()

TypeError:FirstName()缺少1个必需的位置参数:'self'

4 个答案:

答案 0 :(得分:2)

如果要以OOP方式执行此操作,则需要使对象的状态(即用户的名字和姓氏)成为对象的一部分。像这样:

def FirstName(self):
    self.FirstName = input("enter your first name:\n".title())
    return self.FirstName

def LastName(self):
    self.LastName = input("enter your last name:\n".title())
    return self.LastName

def FullName(self, FirstName, LastName):
    print('welcome', "{} {}".format(self.FirstName, self.LastName).title())
    return

self.FirstName是对象的成员,可以从其他方法访问。

但是你还必须在一个对象上调用这些方法。这意味着你必须创建一个类的实例:

user = UserFullName()
user.FirstName()
user.LastName()
user.FullName()

除了因为另外两个问题而无法正常工作。

首先,您的方法与您的属性具有相同的名称。设置self.FirstName后,再也无法再调用FirstName方法,因为您已隐藏它。

其次,初始化程序要求您传入名字,姓氏和姓氏。但是你还没有这些名字!它们只会在以后使用input调用这些方法时才会出现。所以你必须做user = UserFullName('', '', '')之类的事情。但更好的解决方案是完全删除__init__方法,或重新排列事物,以便在创建类之前发生input,并且可以传入名称,而不是在方法内部进行。

答案 1 :(得分:0)

我的示例使用 init 函数,该函数将在您初始化类时执行,如果您不想使用它,则可以使用其他用户提供的以下示例

作为字符串的建议我建议使用raw_input,无论如何以下都可以使用:

class UserFullName():
    def __init__(self):
        self.FirstName()
        self.LastName()
        self.FullName()

    def FirstName(self):
        self.FirstName = raw_input("enter your first name:\n")

    def LastName(self):
        self.LastName = raw_input("enter your last name:\n")

    def FullName(self):
        print("Welcome "+str(self.FirstName)+" "+str(self.LastName))

UserFullName()

如果你想要在前两种方法中返回,你甚至可以用另一种方式做到:

class UserFullName():
    def __init__(self):
        name=self.FirstName()
        surname=self.LastName()
        self.FullName(name,surname)

    def FirstName(self):
        FirstName = raw_input("enter your first name:\n")
        return (FirstName)

    def LastName(self):
        LastName = raw_input("enter your last name:\n")
        return (LastName)

    def FullName(self, name, surname):
        print("Welcome "+str(name)+" "+str(surname))

UserFullName()

答案 2 :(得分:-1)

你打电话给UserFullName,但没有给它__init__函数提供的参数。请尝试使用UserFullName(FirstName='James', LastName='Sull', FullName='James Sull').FirstName()之类的内容。

答案 3 :(得分:-2)

如果要使用类变量,则需要使用self来引用它,并尝试不对变量和方法使用相同的名称。 顺便说一下,你需要创建一个类的实例来使用

  class UserFullName:
        def FirstName(self):
            self.firstName = input("enter your first name:\n".title())
            return self.firstName

        def LastName(self):
            self.lastName = input("enter your last name:\n".title())
            return self.lastName

        def FullName(self):
            print('welcome', "{} {}".format(self.firstName, self.lastName).title())



    userFullName = UserFullName()
    userFullName.FirstName()
    userFullName.LastName()
    userFullName.FullName()

    Enter Your First Name:
    1
    Enter Your Last Name:
    2
    ('welcome', '1 2')

或者如果您更喜欢类方法

class UserFullName:
        @classmethod
        def FirstName(self):
            self.firstName = input("enter your first name:\n".title())
            return self.firstName
        @classmethod
        def LastName(self):
            self.lastName = input("enter your last name:\n".title())
            return self.lastName
        @classmethod
        def FullName(self):
            print('welcome', "{} {}".format(self.firstName, self.lastName).title())

UserFullName.FirstName()
UserFullName.LastName()
UserFullName.FullName()

Enter Your First Name:
1
Enter Your Last Name:
2
('welcome', '1 2')