我正在编写一个程序,该程序接受3个名称的输入,并以4个随机数作为ID输出。
样品:
First name: James
Middle name: Earl
Last name: Jones
输出:
Your ID is: JEJ2953
我通过说Student.enter_name
需要一个论证(自我)来保持重定向。所以我把(自我)放在那里,它说"自我没有定义。"我疯了。我参加的课程稍微超出了我的能力范围。
以下是我所拥有的:
class Student(object):
"""Each student"""
def __init__(self, firstName, midName, lastName):
self.firstName = None
self.midName = None
self.lastName = None
def enter_name(self):
input('First Name: ')
input('Middle Name: ')
input('Last Name: ')
def generate_euid(self):
import random
name = self.firstName[0], self.midName[0], self.lastName[0]
inits = "".join(name)
for x in range(1):
print('Your EUID: ', inits + str(random.randint(1000,9999)))
user = Student.enter_name(self)
user = Student.generate_euid()
答案 0 :(得分:0)
class Student(object):
"""Each student"""
def __init__(self,):
self.firstName = None
self.midName = None
self.lastName = None
def enter_name(self):
self.firstName =input('First Name:')
self.midName =input('Middle Name:')
self.lastName =input('Last Name:')
def generate_euid(self):
import random
name = (self.firstName,self.midName,self.lastName)
inti=''.join(name)
print('Your EUID: ', inti + str(random.randint(1000,9999)))
x=Student()
x.enter_name()
x.generate_euid()
答案 1 :(得分:0)
这个类只是一个模板,用于指定学生应该是什么样子;它没有任何关于任何特定学生本身的信息。为了实现这一点,你必须实例化类 - 这可以通过编写user = Student('John', 'Foo', 'Bar')
(匹配__init__
构造函数中的参数)来完成;这会创建一个Student类型的对象,称为'实例'学生班。
上面有user
之类的实例后,您可以调用绑定到它的任何函数(称为实例方法),它将自动传递自己的self
参数。在这里,您将能够访问和修改您在self
方法中__init__
上定义的变量。
这也是你不能写Student.instance_method()
的原因;由于Student
类是模板而不是具体实例,因此它没有“自身”的概念。引用,因此它无法在不首先实例化的情况下将self
传递给需要它的方法。 (当然,默认情况下没有变量self
,因此当您尝试从全局范围编写self
时,Python不知道user = Student.enter_name(self)
是什么。这就是导致未定义的错误)
有两点需要注意:
是某些方法,即静态方法和类方法,它们不需要self
参数,因此可以从类中调用;这些都有自己的目的,可能超出了这个问题的范围,但简而言之:
class Student:
# ...
@classmethod
def enter_name(cls): # cls is the class, ie `Student`
firstName = input('First name: ')
# ditto for middleName and lastName
return cls(firstName, middleName, lastName)
...这将完成为您实例化的工作,但是来自Student类中封装的方法。您可以将其称为student_variable = Student.enter_name()
,这比创建学生的随机全局函数更容易阅读。 (事实上,比在实例中实例化更好的做法!)self
的方法,本质上是常规函数 - 它们不会传递自动化的第一个参数 - 但它们对于包装和实用程序很有用功能'与一个班级'类本身内的常规方法。您的enter_name()
方法目前实际上什么也没做!为了使其有效,您必须分配输入'将值返回self.firstName
,self.middleName
和self.lastName
以便实际记住它们,之后您可以在generate_euid
等其他方法中使用这些变量。您的__init__
方法也是如此;你接受变量(firstName, midName, lastName)
,但是你对它们什么都不做,实际上就把它们扔掉了。
如果以上内容不清楚,这是一个完整的例子:
class Student(object):
"""Describes a student"""
def __init__(self, firstName, midName, lastName):
self.firstName = firstName
self.midName = midName
self.lastName = lastName
@classmethod # marks the below function as a class method
def enter_name(cls):
first = input('First Name: ')
mid = input('Middle Name: ')
last = input('Last Name: ')
return cls(first, mid, last)
def generate_euid(self):
import random
name = self.firstName[0], self.midName[0], self.lastName[0]
inits = "".join(name)
for x in range(1):
print('Your EUID: ', inits + str(random.randint(1000,9999)))
>>> user0 = Student.enter_name()
First Name: John
Middle Name: Foo
Last Name: Bar
>>> user0.generate_euid()
Your EUID: JFB4979
>>> user1 = Student('Kate', 'Foo', 'Bar')
>>> user1.generate_euid()
Your EUID: KFB2855