Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何强制上课?_Python_Pydub - Fatal编程技术网

Python 如何强制上课?

Python 如何强制上课?,python,pydub,Python,Pydub,我上过这门课: class AudioSegmentCustom(AudioSegment): def fade_override(self, seg, fade_len=100): seg1, seg2 = AudioSegment._sync(self, seg) final = seg1[:-fade_len] a_fin = seg1[-fade_len:].fade(to_gain=-120, start=0, end=floa

我上过这门课:

class AudioSegmentCustom(AudioSegment):

    def fade_override(self, seg, fade_len=100):
        seg1, seg2 = AudioSegment._sync(self, seg)
        final = seg1[:-fade_len]
        a_fin = seg1[-fade_len:].fade(to_gain=-120, start=0, end=float('inf'))
        a_fin *= seg2[:fade_len]
        return (final + a_fin) + seg2[fade_len:]
我面临的问题是,当我创建一些
AudioSegmentCustom
变量时,如果我“添加”它们,
add
操作将返回其原始父类型=
AudioSegment

因此,以下代码不起作用:

final = AudioSegmentCustom.from_mp3(mp3_src) + AudioSegment.from_mp3(mp3_other)
final = final.fade_override(...blabla...)
因为我得到:

'AudioSegment' object has no attribute 'fade_override'
…即使我从一个
AudioSegmentCustom
对象开始,我还是以
AudioSegment
“only”对象结束。 “强制”新创建对象类型的方法是什么

以备不时之需:

class AudioSegment(object):
    def __add__(self, arg):
        if isinstance(arg, AudioSegment):
            return self.append(arg, crossfade=0)
        else:
            return self.apply_gain(arg)
看起来问题是

它无条件地返回一个裸骨骼
AudioSegment
实例。由于这是一种普通方法,您可以在
AudioSegmentCustom
中覆盖它:

def _spawn(self, data, overrides={}):
    """
    Creates a new audio segment using the metadata from the current one
    and the data passed in. Should be used whenever an AudioSegment is
    being returned by an operation that would alters the current one,
    since AudioSegment objects are immutable.
    """
    # accept lists of data chunks
    if isinstance(data, list):
        data = b''.join(data)

    # accept file-like objects
    if hasattr(data, 'read'):
        if hasattr(data, 'seek'):
            data.seek(0)
        data = data.read()

    metadata = {
        'sample_width': self.sample_width,
        'frame_rate': self.frame_rate,
        'frame_width': self.frame_width,
        'channels': self.channels
    }
    metadata.update(overrides)
    return self.__class__(data=data, metadata=metadata)
复制粘贴当然不是一种好的做法,但它确实起到了作用

但是,请注意,它引入了不对称性,因为
AudioSegmentCustom+AudioSegment
返回
AudioSegmentCustom
,而
AudioSegmentCustom+AudioSegmentCustom
返回
AudioSegment

可以通过在
AudioSegmentCustom
中额外提供
\uuu radd\uuuu()
来解决这个问题。它将在
AudioSegment之前调用。\uuuu add\uuu()

您可能应该包括
AudioSegment的代码。\uuuu add\uuu
。它只返回一个AudioSegment对象。你为什么需要它?无论如何,我只是更新了我的问题,因为一种方法是调整它,以便它创建与
self
相同的类的实例。如果您不想更改它,那么您肯定需要编写一个单独的
AudioSegmentCustom.\uuu添加\uuu
方法或在其他地方构建
AudioSegmentCustom
。看起来问题是。它无条件地返回一个裸骨骼
AudioSegment
实例,即使在子类化时也是如此。如果它返回的是
self.\uuuuu class\uuuuu(…)
,您的问题就会得到解决。由于
\u spawn()
不是类方法,因此可以在
AudioSegmentCustom
中重写它。这不是一个好的解决方案,但它应该可以完成这项工作。我只是简单地复制/粘贴了_spawn函数,根据您的建议对其进行了修改,它就可以工作了。我可以请你用几行代码来回答吗?这样我就可以检查你的答案是否有效了?非常感谢。您可以定义
\uuu radd\uuu()
来避免这种不对称性:正如所指出的,在右操作数是左操作数的子类的情况下,Python将首先调用右操作数的
\uuu radd\uuu
。已合并到pydub中,以后的版本应该不再需要这种攻击。