Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类函数错误_Python_Oop - Fatal编程技术网

python类函数错误

python类函数错误,python,oop,Python,Oop,我是一个python新手,我正在尝试使用OOP方式编写简单的项目 第一个函数等待用户界面输入用户名 第二个函数等待用户界面输入用户名 然后 第三个函数打印全名 但是 当我尝试启动这些函数时,它会给我错误 代码如下: class UserFullName: def __init__(self, FirstName, LastName, FullName): self.FirstName = FirstName self.LastName = LastName

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

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

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

然后

第三个函数打印全名

但是

当我尝试启动这些函数时,它会给我错误

代码如下:

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”

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

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('','')
的操作。但更好的解决方案是完全删除
\uuuu init\uuuu
方法,或者重新安排事情,使
输入发生在创建类之前,您可以传入名称,而不是在方法内部执行。

如果您想使用类变量,您需要使用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')

您调用了
UserFullName
,但没有通过在
\uuuuu init\uuuu
函数中提供参数来满足它。请尝试类似于
UserFullName(FirstName='James',LastName='Sull',FullName='James Sull')。FirstName()
的方法。

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

作为字符串I建议使用原始输入的建议,无论如何,以下操作将起作用:

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

您必须首先创建类为
UserFullName
的对象(
name=UserFullName(…)
)。你可能想多读一些OOP的基础知识。下面的所有答案都会修正你的一两个错误,但是如果你想写出真正好的、有用的、正确的代码,你必须阅读一本关于类的教程。StackOverflow答案不能代替教程。好吧,基本上除了构造函数(the
\uuuu init\uuu
)之外的所有东西都是错误的、无用的或设计拙劣的。不应在类中定义从不使用
self
变量的方法。您也从未创建过类的实例,这使得它变得更加无用。而且类应该接受用户输入的情况很少。@abarnert-Nice-typo:P@Aran-阿兰·菲:“我的iPhone自动更正”坚持认为你真的是利雅得的精灵,我该和谁争论呢?@Aran Fey,当然。我补充解释了如何解决他的下一个问题。但我的目标不是调试所有东西并编写所有代码,而是教他如何解决问题。我认为他的问题首先是对象对类,其次是对象关联变量。但是在你编辑之后,这个解决方案是好的。@abarnert我不认为一个只解决OP代码中无数问题之一的答案会非常有用。“你应该读一篇关于类的教程”的评论比这更有用。@Aran Fey好的,我重写了它来解释我看到的所有四个大问题,而不仅仅是我认为他在问的那个问题,前两个问题有明确的代码,并解释了如何自己解决接下来的两个问题。这似乎是正确的平衡吗?(还有,我有没有在代码中遗漏任何更大的错误?@aranfey为什么不呢?再一次,关于对象与类的问题(至少在功能方面)。为什么-1?:为了更好地理解它是如何工作的,使用2个示例:告诉某人如何将他的3.x代码移植到2.x,而不告诉他你正在这样做,这几乎不是一个有用的建议。好的,我没有解释在python 3中,原始输入被输入所取代,但是对于其他部分,即使你解释过,这段代码在python 3上也能完美地工作那,为什么你会建议Python3用户将其现有的、正在工作的
input
调用切换到
raw\u input
,这样你就可以解释他应该像最初那样将其更改为
input
?是的,我很忙,因为标记我只读Python,我写的时候没有想到我使用的Python2多于3。。。但这是一门很容易的课,不太容易理解,无论如何我会记住你的建议,下次我会尽量回答得更好,即使我只是想帮助社区,因为我有时也会问问题