Python 了解函数/变量在类内的工作方式
我正在做一个Python项目,当用户输入视频名称时,它会下载YouTube视频。我从未使用过类,这是我的第一次,我实际上从一本关于类、函数和所有内容的Python书籍中学习过,但是当我试图在实际项目中使用它时,我感到非常困惑。这是我的密码:Python 了解函数/变量在类内的工作方式,python,class,Python,Class,我正在做一个Python项目,当用户输入视频名称时,它会下载YouTube视频。我从未使用过类,这是我的第一次,我实际上从一本关于类、函数和所有内容的Python书籍中学习过,但是当我试图在实际项目中使用它时,我感到非常困惑。这是我的密码: import pytube import urllib.request import urllib.parse import re class YouTubeDownloader: def __init__(self): self.
import pytube
import urllib.request
import urllib.parse
import re
class YouTubeDownloader:
def __init__(self):
self.user_music = self.userInput()
# Ask user what video they want to download
def userInput(self):
print("Please type such as: Chopin Nocturne No 9 op 5")
subject = input("What video do you want to download in YouTube?")
return subject
# Search the youtube video with what user type
def searchYoutube(self, subject):
query_string = urllib.parse.urlencode({"search_query": subject})
html_content = urllib.request.urlopen("http://www.youtube.com/results?" + query_string)
search_results = re.findall(r'href=\"\/watch\?v=(.{11})', html_content.read().decode())
finalURL = "http://www.youtube.com/watch?v=" + search_results[0]
return finalURL
# Download the first video
def downloadVideo(self, finalURL):
youtube = pytube.YouTube(finalURL)
video = youtube.streams.first()
video.download('C:/Users/Muffin/Downloads')
if __name__ == '__main__':
user = YouTubeDownloader()
因此,这里:
self.user\u music
,如果需要,为什么需要它?我没有把任何东西传递给self以外的其他人,有必要吗def userInput
中的subject
变量,在def searchYoutube
中,变量是否自动传递给类中的不同函数self.user\u music
,因此,根据您提供的代码片段,您不需要定义它。如果您没有将任何内容传递给\uuuuu init\uuuuu
,并且在对象实例化期间不需要进行任何自定义初始化,则不需要定义构造函数(\uuuuuu init\uuuu
),因为Python将为您提供默认构造函数subject
的值,则需要将其作为参数传递给可能要使用它的所有其他函数或方法。您可以将其转换为实例属性:self.subject='whatever'
,并在需要时使用它;在这种情况下,您不需要传递它searchYoutube
或downloadVideo
,因此最终答案可能不同
编辑:根据注释中的请求更新代码,以显示如何创建实例变量subject
import pytube
import urllib.request
import urllib.parse
import re
class YouTubeDownloader:
def __init__(self):
self.subject = self.userInput()
# Ask user what video they want to download
def userInput(self):
print("Please type such as: Chopin Nocturne No 9 op 5")
subject = input("What video do you want to download in YouTube?")
return subject
# Search the youtube video with what user type
def searchYoutube(self):
query_string = urllib.parse.urlencode({"search_query": self.subject})
html_content = urllib.request.urlopen("http://www.youtube.com/results?" + query_string)
search_results = re.findall(r'href=\"\/watch\?v=(.{11})', html_content.read().decode())
finalURL = "http://www.youtube.com/watch?v=" + search_results[0]
return finalURL
# Download the first video
def downloadVideo(self, finalURL):
youtube = pytube.YouTube(finalURL)
video = youtube.streams.first()
video.download('C:/Users/Muffin/Downloads')
if __name__ == '__main__':
youtube_downloader = YouTubeDownloader()
# Example of searching YouTube
final_url = youtube_downloader.searchYoutube()
因此,我确实需要init来添加self.subject='whatever',正确吗???@sarahkim严格来说-否。Python允许您在对象初始化之后(在构造函数之外)定义实例属性,尽管不建议这样做。如果您打算使用
self.subject
,最好在\uuuu init\uuuu
中定义它,并在其他方法中更改它的值。这是使用类的一种不好的方式吗?对于这个项目,你认为最好不要使用这个类吗?@sarahkim这很好,不过你可能想将self.user\u music
重命名为self.subject
,从方法searchYoutube
中删除参数subject
,并访问self.subject
,而不仅仅是subject
。您介意告诉我如何修复代码吗?我创建了self.subject=subject并尝试访问self.subject,但是我得到了很多额外的错误…类内的函数作用域与类外的函数作用域相同–函数无法访问另一个单独函数的局部变量。无论是否使用类,都必须以相同的方式编排函数/方法。请注意,对于类来说,这不是一个好的用例–方法之间没有共享状态。@Mistermiagi,但我有返回subject的函数“userInput”,我想在下一个函数“searchYoutube”中使用subject变量。