【问题标题】:Python instance from class not initiating类中的 Python 实例未启动
【发布时间】:2018-10-07 11:12:43
【问题描述】:

我正在学习 Python,目前正在做课堂练习。有了这个,我不知道出了什么问题。说明是:

编写一个名为 Pets 的类,具有以下属性:

  • 姓名
  • 类型
  • 年龄

它应该有一个 __init__ 方法创建这些属性,还应该有以下方法:

  • set_name 为 name 赋值
  • set_type 为类型赋值
  • set_age 为年龄赋值

  • get_name 返回名称的值

  • get_type 返回类型的值
  • get_age 返回年龄值

然后,编写一个程序,启动一个对象并提示用户输入姓名、类型和年龄。使用对象的方法查找宠物的名称、类型和年龄,并将其显示在屏幕上。

这是我写的代码:

class Pet():

    def __init__(self, name, type, age):
        self.name = name
        self.type = type
        self.age = age

    def set_name(self):
        name = input("Type in the pet's name: ")

    def set_type(self):
        type = input("Type in the pet's type: ")

    def set_age(self):
        age = int(input("Type in the pet's age: "))

    def get_name(set_name):
        return set_name

    def get_type(set_type):
        return set_type

    def get_age(set_age):
        return set_age

 pet = Pet(set_name, set_type, set_age)

我得到一个 NameError: name 'set_name' is not defined。从 Pet 类创建对象时,我尝试了不同的参数。

我应该如何定义方法和参数以使其工作?

【问题讨论】:

  • 指令说从设置名称等。该方法不应调用input。类外的代码应该首先从用户那里收集姓名、类型和年龄,然后使用这些值创建一个 Pet。
  • FWIW,在 Python 中,我们通常不使用 setter 和 getter 方法进行简单的属性访问。我的猜测是这本书最初是为 Java 等另一种语言编写的,并且已经适应了 Python。
  • 谢谢@PM2Ring,现在说得通了。并注意了 setter 和 getter 方法。

标签: python class


【解决方案1】:

当你调用命令时:

pet = Pet(set_name, set_type, set_age)

虽然 set_name、set_type 和 set_age 是您的类的方法,但它们被解释为变量,它们还没有被初始化。

尝试将您的代码重构为:

name = 'Ted'
type = 'Bear'
age = 5

pet = Pet(name, type, age)

【讨论】:

    【解决方案2】:

    pet = Pet(set_name, set_type, set_age) 您永远不会定义全局变量set_nameset_typeset_age。如果是字符串,请使用pet = Pet("set_name", "set_type", "set_age")

    那么这是错误的: ` def get_name(set_name): 返回集合名称

    def get_type(set_type):
        return set_type
    
    def get_age(set_age):
        return set_age`
    

    方法的第一个参数应该是self,所以你返回的实际上是对象本身。

    def set_name(self): name = input("Type in the pet's name: ") 也是错误的,您将输入的结果存储在临时变量中。

    这更像是一个适当的类(尽管我会使用属性而不是显式的 setter/getter):

    class Pet:
        def __init__(self, name, type, age):
            self.name = name
            self.type = type
            self.age = age
    
        def set_name(self, name):
            self.name = name
    
        def set_type(self, type):
            self.type = type
    
        def set_age(self, age):
            self.age = age
    
        def get_name(self):
            return self.name
    
        def get_type(self):
            return self.type
    
        def get_age(self):
            return self.age
    
     pet = Pet("Foo", "cat", 4)
    

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2014-02-01
      • 2014-02-04
      相关资源
      最近更新 更多