2015-04-17 3 views
-3

Как говорится в названии, как вы называете функцию в классе другой программы?Вызов функции в классе другой программы - Python

Class.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 

Generator.py

from test import Object 
import test 

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

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

Настроение устанавливается как значение по умолчанию "счастливым". Мне нужно, что для изменения на основании случайного целого числа обвалять в тесте, так что, когда появится настроение, он не всегда отображается как «счастливый»

+1

Можете ли вы быть более ясными? Не можете ли вы просто использовать метод check_mood, чтобы изменить настроение? –

+0

Этот код очень ... непоследовательный, мягко говоря. – Manhattan

+0

Что такое 'Object.test()'? – Dannnno

ответ

0

Вы должны явно вызова 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внутриget_mood (или просто избавиться от check_mood целиком и поместить свой код внутри get_mood).

Тем не менее, определяется способ get_mood, который изменяет оригинал self.__mood, при этом исходный переданный аргумент теряется после вызова get_mood.

0

Есть много проблем с этим. Давайте начнем с вашего класса Object. Вероятно, вы не хотите называть что-то Object - он слишком похож на object встроенный Python и не предоставляет никакой реальной информации о том, что делает класс. Кроме того, вы, вероятно, не хотите вызывать переменную экземпляра __mood - это вызовет манипулирование именем, которое, вероятно, не то, что вы хотите. Вы, вероятно, даже не хотите, чтобы один символ подчеркивания; который представляет собой «частный» элемент данных (и нет четкой причины, почему это должно быть частным). Вам не нужны функции getter и setter в Python, потому что вы можете напрямую обращаться к атрибутам, но если вы хотите, чтобы более мелкозернистый элемент управления использовал свойство вместо этого. Наконец, нам не нужно сохранять переопределение случайной переменной в вашей функции 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 - вы просто вызываете функцию test() на свой Object класс, а не экземпляр его. Затем, когда вы вызываете get_mood(), он не работает, потому что это функция экземпляра - его можно вызвать только в экземплярах вашего класса Object.

Смежные вопросы