Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从另一个类获取变量?_Python_Class_Oop_Variables - Fatal编程技术网

Python 如何从另一个类获取变量?

Python 如何从另一个类获取变量?,python,class,oop,variables,Python,Class,Oop,Variables,我有以下课程: 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

我有以下课程:

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来处理类内核,它是类登录的子级

如您所见,我创建了Login()对象并将其存储到变量obj中。在Login类中,有一个名为Login的方法,它保存一个名为usr的自变量

我尝试在另一个类中使用以下命令调用它:

obj.usr
obj.self.usr
obj.login.usr
obj.login.self.usr
但这些都不起作用。
我如何才能做到这一点?

只有在调用
登录方法时才会设置
usr
属性。您需要调用该函数才能使用
obj.login()
设置属性。然后您可以使用
obj.usr
访问它

基于内核是
Login
的子类这一事实,在
Kernel
方法中创建另一个
Login
对象可能没有任何好处,您可以调用
self.Login()
self.usr


另外,我猜您可能来自另一种语言,其中具有相同类名的方法是构造函数?Python中不是这种情况,构造函数被称为
\uuu init\uu
obj。usr
是正确的方法。但是,在调用
login
对象的
login
方法之前,该属性将不存在。您需要执行以下操作:

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

如果不确切地知道类的使用方式(例如,登录对象的登录“应该”发生的时间),就很难确切地知道何时应该调用
login()
。另一种可能性是,您实际上希望在登录类的
\uuuu init\uuuu
期间设置
usr
pwd
,以便在创建对象后立即存在它们。

创建全局定义的dict.ex:

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() + ">")

在内核实例中创建Login()实例似乎有些奇怪,因为内核已经将Login子类化了(因此它具有与登录实例相同的方法和属性,而不必调用Login()基类通常是“is-a”关系。
内核
是一个
登录
?相反,
内核
应该有一个
登录
方法。同意这里的Mark。奇怪的设计风格:)