Понимание того, как функции / переменные работают внутри класса - PullRequest
1 голос
/ 05 апреля 2020

Я работаю над проектом 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()

Так вот:

  1. Нужно ли мне self.user_music, и если да, то зачем мне это нужно? Я ничего не передаю __init__, кроме self , это необходимо?
  2. Я хочу использовать переменную subject из функции def userInput в def searchYoutube, передается ли переменная автоматически различным функциям в классе?

1 Ответ

1 голос
/ 05 апреля 2020
  1. Ваш код никогда не использует self.user_music, поэтому, основываясь на предоставленном вами фрагменте кода, вам не нужно его определять. Если вы ничего не передаете в __init__ и не нуждаетесь в какой-либо пользовательской инициализации во время создания объекта, вам не нужно определять конструктор (__init__), потому что Python предоставит вам конструктор по умолчанию для вас .
  2. Имена, определенные внутри функции, относятся к локальной области действия функции и не видны за пределами этой области. Если вы хотите использовать значение 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()
...