【问题标题】:Why is self not defined in my program为什么我的程序中没有定义 self
【发布时间】:2015-06-26 13:44:55
【问题描述】:

程序的第一部分定义了类,第二部分通过不同的程序调用类,但我不断收到“TypeError: check_mood() missing 1 required positional argument: 'self'” for line 5 在第二部分 随机导入

class Animal:
    #initialize attributes
    def __init__(self,animal_type, name, mood):
        self.__animal_type = animal_type
        self.__name = name
        self.__mood = mood

    # set methods
    def set_animal_type(self, animal_type):
        self.__animal_type = animal_type

    def set_name(self, name):
        self.__name = name

    def set_mood(self, mood):
        self.__mood = mood

    #check mood
    def check_mood(self):
        integer = random.randint(1,3)
        if integer == 1:
            self.__mood = "happy"
        elif integer == 2:
            self.__mood = "hungry"
        elif integer == 3:
            self.__mood = "sleepy"


    #return methods
    def get_animal_type(self):
        return self.__animal_type

    def get_name(self):
        return self.__name

    def get_mood(self):
        return self.__mood

我做了一个简单的测试程序来运行它:

import Animal

an = input("enter aninal:")
na = input("enter name:")
mo = Animal.Animal.check_mood()

animals = Animal.Animal(an,na,mo)

print(animals.get_animal_type(), animals.get_name(), animals.get_mood())

【问题讨论】:

  • Animal.Animal.check_mood() 你试图在没有实例的情况下调用 instance 方法。您需要使用一个实例,例如a = Animal(); a.check_mood()
  • 我这样做并收到错误“TypeError: 'module' object is not callable”
  • @helpplease,它需要 Animal.Animal() 来获取模块内的类。模块通常最好用小写字母命名。
  • 我也试过了,但收到一条错误消息,提示我缺少 3 个必需的位置参数
  • @helpplease,你自己写了这段代码。它需要三个参数。你打电话给Animal.Animal(),口译员回答“缺少 3 个必需的位置参数”。你觉得哪里不对?

标签: python class python-3.x attributes typeerror


【解决方案1】:

您正在尝试运行一个类方法而不首先实例化您的类:

Animal.Animal.check_mood()

这不起作用,除非 check_mood() 是类方法或静态方法。

您需要实例化您的类并在实例上运行您的方法

dog = Animal()
dog.check_mood()

或使用静态方法或类方法。

静态方法是不接收隐式第一个参数的函数(如实例方法中的self),因此只是一个常规函数。

类方法是一个函数,它接收类本身而不是实例作为其第一个参数。这通常仅在您想从非标准参数创建类的实例时才有用。在这种情况下,这可能没有用,因为您实际上并不需要方法中的类。

如何使用静态方法的示例:

class Animal(object):
    @staticmethod
    def check_mood():
          #yourfunction

还有一个类方法:

class Animal(object):
    @classmethod
    def check_mood(cls):
          #yourfunction

但是,由于您在谈论动物的情绪,我假设您想先实例化动物,然后检查它的情绪。

【讨论】:

    【解决方案2】:

    check_mood() 是一个实例方法——它需要一个特定的动物来检查它的情绪。但是这里

    mo = Animal.Animal.check_mood()
    

    您是在询问 Animal 类本身的情绪。相反,请像这样从__init__ 调用它:

    self.check_mood()
    

    然后,您将删除给出当前错误的行,仅将两个参数传递给Animal(),并修改def __init__ 行,使其不再期望情绪(因为动物本身随机生成它)。

    【讨论】:

    • 心情应该是从3个选项中随机生成的,这就是为什么我在第一部分检查心情
    • @helpplease,如果你需要随机生成情绪,你可以在构造函数中完成。在Animal.__init__ 中调用Animal.check_mood,而不是将mood 作为参数传递给Animal.__init__
    • 我对它在程序中的位置感到困惑。对不起,我真的对此感到困惑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多