python类函数错误
我是一个python新手,我正在尝试使用OOP方式编写简单的项目 第一个函数等待用户界面输入用户名 第二个函数等待用户界面输入用户名 然后 第三个函数打印全名 但是 当我尝试启动这些函数时,它会给我错误 代码如下:python类函数错误,python,oop,Python,Oop,我是一个python新手,我正在尝试使用OOP方式编写简单的项目 第一个函数等待用户界面输入用户名 第二个函数等待用户界面输入用户名 然后 第三个函数打印全名 但是 当我尝试启动这些函数时,它会给我错误 代码如下: class UserFullName: def __init__(self, FirstName, LastName, FullName): self.FirstName = FirstName self.LastName = LastName
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。。。但这是一门很容易的课,不太容易理解,无论如何我会记住你的建议,下次我会尽量回答得更好,即使我只是想帮助社区,因为我有时也会问问题