ID生成器使用类

时间:2018-02-23 04:38:30

标签: python class methods

我正在编写一个程序,该程序接受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()

2 个答案:

答案 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)是什么。这就是导致未定义的错误)

有两点需要注意:

  1. 某些方法,即静态方法和类方法,它们不需要self参数,因此可以从类中调用;这些都有自己的目的,可能超出了这个问题的范围,但简而言之:

    • 类方法传递对未实例化类的引用而不是变量,通常是为了从其中创建类的实例。作为一个例子,您可以像这样定义您的enter_name方法(wonky list codeblock,对不起):
      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的方法,本质上是常规函数 - 它们不会传递自动化的第一个参数 - 但它们对于包装和实用程序很有用功能'与一个班级'类本身内的常规方法。
  2. 您的enter_name()方法目前实际上什么也没做!为了使其有效,您必须分配输入'将值返回self.firstNameself.middleNameself.lastName以便实际记住它们,之后您可以在generate_euid等其他方法中使用这些变量。您的__init__方法也是如此;你接受变量(firstName, midName, lastName),但是你对它们什么都不做,实际上就把它们扔掉了。

  3. 如果以上内容不清楚,这是一个完整的例子:

    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