为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性?

题目来源
这个题目来自:《Python编程:从入门到实践》第1版,习题9-12:多个模块

相关代码
user.py
class User():

def __init__(self, first_name, last_name, sex, age):

self.first_name = first_name.title()

self.last_name = last_name.title()

self.sex = sex

self.age = age

def describe_user(self):

--snip--

def greet_user(self):

--snip--

admin_privileges.py
from user import User

class Admin(User):

def __init__(self, first_name, last_name, sex, age):

super().__init__(first_name, last_name, sex, age)

self.privileges = Privileges()

class Privileges():

def __init__(self):

self.privileges = ['can add post', 'can delete post',

'can ban user']

def show_privileges(self):

print("Admin's privileges: ")

for privilege in self.privileges:

print("--" + privilege)

test.py
from admin_privileges import Admin

my_admin = Admin('Jade', 'Lam', 'male', '22')

my_admin.describe_user()

my_admin.greet_user()

my_admin.privileges.show_privileges()

print('\n')

你期待的结果是什么?实际看到的错误信息又是什么?
    我在书上9.4.1(P155)看到,“import语句让Python打开模块car,并导入其中的Car类。这样我们就可以使用Car类了,就像它是在这个文件中定义一样”

所以我认为,在‘test.py’中只导入了admin模块中的Admin类,就相当于只复制了class Admin()的相关代码,而缺少了‘admin_privileges.py’中的from user import User 和class Privileges()的相关代码。这样一来,在‘test.py’中,无论是Admin类的实例化,还是最后调用这个实例的属性中privileges的show_privileges,都应该会报错啊。

但是,书中的答案就是这样写的,运行也出现了想要的结果。


回答:

举个例子:
为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性?
我在test1.py中定义一个打印信息,一个Test1类,然后实例化后调用一个方法,还有一个ImportTest类,用于test2.py调用
为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性?
然后在test2.py中我直接导入test1.py的ImportTest类,其他什么操作都不做,然后直接运行test2.py,结果如下:
为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性?
运行test2.py却执行了test1.py的所有代码
我的理解是:当test2.py在运行时,python解释器会将其导入的相关的文件代码(test1.py)都扫一遍加载到内存当中,然后等待调用。

所以在你的问题当中:
在执行test.py时,python解释器会扫描到admin_privileges.py文件的代码并加入到内存中等待调用,在扫描admin_privileges.py的时候又发现导入了user.py,所以又把user.py的代码加入到内存中等待调用,所以你说的会报错的情况不会存在,因为所有可能会调用的代码的在内存中,不存在调用不到的情况。

我的理解是这样,说的不对的地方希望有大佬指正,谢谢。


回答:

导入Admin时,admin_privileges.py 里的import语句也会得到执行,因此user.py也被导入了。

以上是 为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性? 的全部内容, 来源链接: utcz.com/a/162525.html

回到顶部