为什么我在文件中只用导入子类,而不用导入它的父类和它的实例属性?
题目来源
这个题目来自:《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 Userclass 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 Adminmy_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