2013-09-08 6 views
-1

У меня есть следующий класс:Как получить переменную из другого класса?

class Login(): 
    #PROMPT THE OPERATOR TO LOGIN 
    def login(self): 
     self.usr = input("usr> ") 
     self.pwd = getpass.getpass("pwd> ") 
     self.check_login() 

У меня тоже есть этот класс:

class Kernel(Login): 
    #THIS IS WHERE THE OPERATOR CAN ENTER STUFF AND SHIT. 
    def kernel(self): 
     obj = Login() 
     kernel_input = input(obj.login.self.usr + "@" + OS_NAME.lower() + ">") 

Однако, я понятия не имею, как получить переменную self.usr из класса Вход для работы над классом Kernel который является ребенком до класса Войти.

Как вы можете видеть, я создал объект Login() и сохранил его в переменной obj. В классе Login существует метод, называемый логином, который содержит переменную self, называемую usr.

Я попытался назвать его в другом классе, используя:

obj.usr 
obj.self.usr 
obj.login.usr 
obj.login.self.usr 

Но ничего из этого не работает. Как я мог сделать эту работу?

+2

Это кажется странным, чтобы создать экземпляр Логин() внутри экземпляра ядра, когда ядро ​​уже подклассы Логин (поэтому он имеет все те же методы и атрибуты, как, например Login, без вызова Login() – Ben

+2

Базовые классы обычно являются отношениями «is-a». «Ядро» - это «Логин». Вместо этого «Kernel» должен иметь метод «login». –

+0

Согласен с Mark здесь. Нечетный стиль дизайна:) – Shashank

ответ

0

Атрибут usr устанавливается только в том случае, если вы вызываете метод login. Вы должны будете вызвать это для атрибута, который должен быть установлен с obj.login(). Затем вы можете получить доступ к нему с помощью obj.usr.

Исходя из того, что ядро ​​является подклассом Login, нет, вероятно, никакой выгоды от создания другого Login объекта в методе kernel, вы могли бы назвать self.login() и self.usr.

Кроме того, я предполагаю, что вы можете перейти с другого языка, где метод с тем же именем класса является конструктором? Это не относится к Python, конструктор называется __init__.

1

obj.usr - правильный путь. Однако этот атрибут не будет существовать до тех пор, пока не будет вызван метод login объекта Login. Вы должны были бы сделать что-то вроде:

obj = Login() 
obj.login() 
# now you can use obj.usr 

Трудно точно знать, когда вы должны называть login(), не зная точно, как ваши классы предназначены для использования (например, когда Логин Логина объекта является «предполагается» бывает). Другая возможность заключается в том, что вы действительно хотите установить usr и pwd во время класса входа __init__, поэтому они существуют, как только объект создается.

-1

создать глобально определенный dict. например:

mydict = dict() 
class Login(): 
    #PROMPT THE OPERATOR TO LOGIN 
    def login(self): 
     self.usr = input("usr> ") 
     self.pwd = getpass.getpass("pwd> ") 
     mydict.update({'password':self.pwd, 'user': self.usr}) 
     self.check_login() 

class Kernel(Login): 
    #THIS IS WHERE THE OPERATOR CAN ENTER STUFF AND SHIT. 
    def kernel(self): 
     kernel_input = input(mydict['user'] + "@" + OS_NAME.lower() + ">")