Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
491 views
in Technique[技术] by (71.8m points)

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

题目来源
这个题目来自:《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('
')
你期待的结果是什么?实际看到的错误信息又是什么?
    我在书上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,都应该会报错啊。
    但是,书中的答案就是这样写的,运行也出现了想要的结果。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...