【问题标题】:Calling a function in a class of another program - Python在另一个程序的类中调用函数 - Python
【发布时间】:2015-06-23 17:10:30
【问题描述】:

正如标题所说,如何调用另一个程序的一个类中的函数?

类.py

class Object:
     def __init__(self, mood):
         self.__mood = mood
     def set_mood(self, mood):
         self.__mood = mood
     def check_mood(self):
         if random.randint(1, 3) == 1:
             self.__mood = 'happy'
         elif random.randint(1, 3) == 2:
             self.__mood = 'hungry'
         elif random.randint(1, 3) == 3:
             self.__mood = 'sleepy'
    def get_mood(self):
        return self.__mood

生成器.py

from test import Object
import test

mood = 'happy'
ani = Object.test(mood)

print("This is your mood: " + get_mood())

心情被设置为“快乐”的默认值。我需要根据测试中的随机整数滚动进行更改,以便在显示情绪时,它并不总是显示为“快乐”

【问题讨论】:

  • 你能说得清楚一点吗?就不能用check_mood方法来改变心情吗?
  • 这段代码非常...不一致,至少可以这么说。
  • 什么是Object.test()
  • Object.test() 来自哪里? ani 是做什么用的?为什么从未使用过check_mood?应该使用class Object 的实例调用get_mood()。我想你可能不明白类的静态函数和成员函数之间的区别。
  • @Saicharan S M,这就是我想要弄清楚的。我猜在调用没有帮助之前有默认值。所以我改了这个:def __init__(self): self.__mood = 'happy'现在默认值设置好了,check_mood(self)应该改心情,但是不知道有没有,因为我打印的时候改成:print("This is your mood: " mood.get_mood()),但是心情仍然没有改变

标签: python class call default


【解决方案1】:

您必须显式调用check_mood 来更改对象的属性。请参阅下面的代码。

from random import randint

class Foo(object):

    def __init__(self, mood):
        self.__mood = mood
        self.__selection = {
                            1:'happy',
                            2:'hungry',
                            3:'sleepy',
                            4:'angry',
                            5:'bored'
                            }

    def check_mood(self):
        m = randint(1,5)
        self.__mood = self.__selection[m]

    def get_mood(self):
        return self.__mood

mood = 'happy'

f = Foo(mood)
print 'This is your previous mood:', f.get_mood()

f.check_mood() # This rerolls the mood.
print 'This is your current mood:', f.get_mood()

# This is your previous mood: happy
# This is your current mood: bored

否则,如果你想让它改变“幕后”,我建议调用check_mood inside get_mood(或者干脆完全摆脱check_mood并把它的代码在get_mood)。

但是,get_mood 的定义方式使它修改了原始的self.__mood,一旦您调用get_mood,就会使原始传入的参数丢失。

【讨论】:

    【解决方案2】:

    这...有很多问题。让我们从您的Object 课程开始。您可能不想命名 Object - 它与 Python 内置函数 object 过于相似,并且没有提供有关该类的功能的任何真实信息。此外,您可能不想调用实例变量__mood - 这将调用名称修改,这可能不是您想要的。您甚至可能不想要单个下划线;它代表一个“私有”数据成员(并且没有明确的理由为什么它应该是私有的)。您不需要 Python 中的 getter 和 setter 函数,因为您可以直接访问属性,但如果您确实想要更细粒度的控制,请改用属性。最后,我们不需要在check_mood 函数中不断重新定义随机变量——事实上它可能会引入错误。让我们看看这个替代定义。

    person.py

    import random
    
    class Person(object):
        _mood = None
    
        def __init__(self, mood):
            self.mood = mood
    
        @property
        def mood(self):
            return self._mood
    
        @mood.setter
        def mood(self, new_mood):
            self._mood = new_mood
    
        def check_mood(self):
            rand_mood = random.randint(1, 3)
            if rand_mood == 1:
                self.mood = 'happy'
            elif rand_mood == 2:
                self.mood = 'hungry'
            else:
                self.mood = 'sleepy'
    

    这样好一点。现在让我们看看您的其他文件。

    from person import Person
    
    myPerson = Person("happy")
    print("This is your mood: ", myPerson.mood)
    

    这应该打印出Person的心情。

    在您的代码中,您永远不会创建 Object 的实例 - 您只需在 Object 类上调用一些 test() 函数,而不是它的实例。然后,当您调用 get_mood() 时,它不起作用,因为这是一个实例函数 - 它只能在您的 Object 类的实例上调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多