Несмотря на то, что принятый anwer присутствует, я хотел бы добавить немного описания.
Давайте сделаем небольшое упражнение
, прежде всего определим класс следующим образом:
class A:
temp='Skyharbor'
def __init__(self, x):
self.x=x
def change(self, y):
self.temp=y
Итак, что мы имеем здесь?
temp
, который является строкой self.x
Довольно прямо вперед до сих пор? Теперь давайте начнем играть с этим классом. Давайте сначала инициализируем этот класс:
a = A('Tesseract')
Теперь сделайте следующее:
>>> print a.temp
Skyharbor
>>> print A.temp
Skyharbor
Ну, a.temp
работал так, как ожидалось, но как, черт возьми, A.temp
работал? Ну, это сработало, потому что temp - это атрибут класса. Все в python - это объект. Здесь A также является объектом класса type
. Таким образом, temp атрибута является атрибутом, принадлежащим классу A, и если вы измените значение temp через A (а не через экземпляр a), измененное значение будет отражено во всем экземпляре класса A. Давайте продолжим и сделаем это:
>>> A.temp = 'Monuments'
>>> print A.temp
Monuments
>>> print a.temp
Monuments
Интересно, не так ли? И обратите внимание, что id (a.temp) и id (A.temp) все те же
Любой объект Python автоматически получает атрибут dict, который содержит его список атрибутов. Давайте рассмотрим, что этот словарь содержит для наших объектов-объектов:
>>> print A.__dict__
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print a.__dict__
{x: 'Tesseract'}
Обратите внимание, что атрибут temp
указан среди атрибутов класса A, тогда как x указан для экземпляра
Итак, что мы получаем определенное значение a.temp
, если оно даже не указано для экземпляра a. Ну, это волшебство метода __getattribute__()
. В Python точечный синтаксис автоматически вызывает этот метод, поэтому, когда мы пишем a.temp
, Python выполняет a.getattribute ('temp'). Этот метод выполняет действие поиска атрибута, то есть находит значение атрибута, просматривая в разных местах.
Стандартная реализация __getattribute__()
сначала ищет внутренний словарь (dict) объекта, а затем тип самого объекта. В этом случае a.__getattribute__('temp')
выполняет сначала a.__dict__['temp']
, а затем a.__class__.__dict__['temp']
Теперь давайте воспользуемся нашим методом change
:
>>> a.change('Intervals')
>>> print a.temp
Intervals
>>> print A.temp
Monuments
Ну, теперь, когда мы использовали себя , print a.temp
дает другое значение из print A.temp
.
Теперь, если мы сравним id (a.temp) и id (A.temp), они будут разными
В Windows вы можете легко установить ffmpeg через chocolatey
choco install ffmpeg
blockquote>
brew install ffmpeg
установит то, что вам нужно, и все зависимости, если вы находитесь на Mac.
Вы можете установить их на
sudo apt-get install -y libav-tools
Я знаю, что пользователь спросил об этом для Linux, но у меня была эта проблема в Windows (10 64 бит), и я нашел мало информации, поэтому я решил это:
Если LIBAV не помогает, попробуйте FFMPEG , копируя содержимое папки «bin», где находится «youtube-dl.exe». Это не помогло мне, но другие сказали, что это так, поэтому стоит попробовать.
Надеюсь, это поможет кому-то, имеющему проблему в Windows.
Что работало для меня (youtube-dl version 2018.03.03, ffprobe 0.5, avvbe, 3.4.1-tessus, в Hi-Sierra / iMac):
brew install libav
blockquote>(благодаря записи marciovsena на GitHub ).
Я видел в другом месте, что libav может быть устаревшим в будущем, но я буду беспокоиться об этом, когда мы туда доберемся.
Существует некоторая путаница для установленных пользователями POP для Windows. В инструкциях рассказывается о конкретной папке с именем «youtube-dl.exe». Нет такой папки, если вы будете устанавливать ее. Решение:
-Edit: Заклинания
вы можете решить эту проблему, установив ffmpeg
на:
sudo apt-get install ffmpeg
до этого, чтобы убедиться, что у вас есть последняя версия для youtube-dl
sudo youtube-dl -U