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.

我正在做一个Python项目,当用户输入视频名称时,它会下载YouTube视频。我从未使用过类,这是我的第一次,我实际上从一本关于类、函数和所有内容的Python书籍中学习过,但是当我试图在实际项目中使用它时,我感到非常困惑。这是我的密码:

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变量。