如何在Python中导入并使用另一个程序类中定义的变量?解决跨文件访问类内用户输入变量失败问题
解决Python跨文件访问类内变量的问题
我来帮你搞定这个跨文件调用类变量的问题,先看看你的代码里的几个关键错误,然后一步步修正:
首先修正try3.py的问题
你的vdoterm类的__init__方法没有接收url和path参数,导致创建实例t的时候传参直接报错,自然没法正确初始化类内的变量。另外,类的初始化方法必须把传入的参数赋值给self属性,这样外部才能通过实例访问到这些变量。
修正后的try3.py代码:
from pytube import YouTube class vdoterm: # 这里要把url和path作为参数传入__init__方法 def __init__(self, url, path): self.url = url # 把传入的url赋值给实例属性 self.path = path # 把传入的path赋值给实例属性 # 获取用户输入 url = input("Enter the video URL: ") path = input("Enter the path: ") # 现在创建实例时传参数就不会报错了 t = vdoterm(url, path)
再修正try2.py的问题
down类的video方法是实例方法,第一个参数必须是self,否则调用时会把实例本身当作第一个参数传给url,导致参数不匹配。- 调用
t2.video()的时候没有传参数,但方法定义需要url和path,你需要从导入的t对象中获取这两个值传进去。 - 多次创建
YouTube(url)实例有点浪费,建议复用同一个对象,提升效率。
修正后的try2.py代码:
from pytube import YouTube from try3 import t # 导入try3中已经创建好的t实例 class down: # 实例方法必须带self参数 def video(self, url, path): y = YouTube(url) # 只创建一次YouTube对象 video1 = y.streams.first().download(path) # 复用y对象的属性,不用重复调用YouTube(url) print(f"title:{y.title}, views:{y.views}, Length:{y.length}") print("Successfully done") return video1 t2 = down() # 从t实例中取出url和path参数传入video方法 t2.video(t.url, t.path)
为什么之前的尝试没效果?
- 最初的
vdoterm类初始化方法有问题,导致t实例根本没正确创建,自然访问不到url和path属性。 video方法缺少self参数,不符合Python实例方法的规范,调用时会触发参数错误。- 调用
video时没传必要的参数,即使导入了t,也没有把t的属性传递过去。
额外说明
当你在try2.py中from try3 import t时,Python会先执行try3.py中的所有顶级代码(包括用户输入的部分),所以运行try2.py的时候,会先弹出输入URL和路径的提示,之后才会执行下载逻辑,这是正常的模块导入行为。
内容的提问来源于stack exchange,提问作者shaila
相关产品推荐
相关产品推荐

