python 自定义的参数问题

Python内置的slice
使用方法:
slice(stop)
slice(start, stop[, step])


# 双下__new__方法接受所有参数.
def __new__(*args, **kwargs): 
# 双下init仅接受一个参数.
def __init__(self, stop): 

是如何实现, 可以传递一个参数或三个参数的.
# slice可见的源码部分.
class slice(object):
    """
    slice(stop)
    slice(start, stop[, step])
    
    Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
    """
    def indices(self, len): # real signature unknown; restored from __doc__
        """
        S.indices(len) -> (start, stop, stride)
        
        Assuming a sequence of length len, calculate the start and stop
        indices, and the stride length of the extended slice described by
        S. Out of bounds indices are clipped in a manner consistent with the
        handling of normal slices.
        """
        pass

    def __eq__(self, *args, **kwargs): # real signature unknown
        """ Return self==value. """
        pass

    def __getattribute__(self, *args, **kwargs): # real signature unknown
        """ Return getattr(self, name). """
        pass

    def __ge__(self, *args, **kwargs): # real signature unknown
        """ Return self>=value. """
        pass

    def __gt__(self, *args, **kwargs): # real signature unknown
        """ Return self>value. """
        pass

    def __init__(self, stop): # real signature unknown; restored from __doc__
        pass

    def __le__(self, *args, **kwargs): # real signature unknown
        """ Return self<=value. """
        pass

    def __lt__(self, *args, **kwargs): # real signature unknown
        """ Return self
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __ne__(self, *args, **kwargs): # real signature unknown
        """ Return self!=value. """
        pass

    def __reduce__(self, *args, **kwargs): # real signature unknown
        """ Return state information for pickling. """
        pass

    def __repr__(self, *args, **kwargs): # real signature unknown
        """ Return repr(self). """
        pass

    start = property(lambda self: 0)
    """:type: int"""

    step = property(lambda self: 0)
    """:type: int"""

    stop = property(lambda self: 0)
    """:type: int"""


    __hash__ = None

可以看到,slice 类中定义了一个 new 方法和一个 init 方法。

new 方法是一个静态方法,它接受任意数量的参数,并返回一个新的 slice 对象。

init 方法是一个实例方法,它只接受一个参数,即 stop。

通过这两个方法的结合, Python 可以支持两种形式的调用:

使用 slice(stop) 的形式调用,__new__方法会接受所有的参数,并返回一个新的对象,__init__方法仅接受stop参数
使用 slice(start, stop[, step]) 的形式调用,new方法会接受所有的参数,并返回一个新的对象,__init__方法仅接受stop参数,但是通过 new 方法传递的所有参数都已经可以在这个新的对象中使用了.

这样,就能支持使用一个参数或三个参数来创建一个 slice 对象,而不需要定义多个不同的类或方法。

其中indices方法用于计算在一个长度为len的序列中,根据所传参数计算出起始点和终止点和步长,当超出范围时,会进行修剪。

这就是slice类如何实现可以传递一个参数或三个参数的功能的。
回答不易,望采纳

你看到的这不叫源码有可能是以下情况:
父类中声明函数,但不声明实现,由继承的子类进行实现,也就是说这就是一个空方法;

2、这个函数的具体实现不用Python编写,而是由C这种高效语法编写,在包中只用一个空方法占位,调用的时候是调用C语言实现的方法。Python中有一些需要大量运算的内置函数是用C或者C++写的

而至于你说的传递任意参数是*这个字符的功能
解释器将自动进行解包然后传递给多个单变量参数
比如

def oper(*args):
        print(args)
oper("q","s","d","z","b","f")
oper(3)

其实关键就在于*args和 **kwargs
加一个星,表示一个可变数量的位置参数,调用的时候传入多个参数,接收到的将是一个元组
加两个星,表示一个可变数量的名称参数,调用的时候传入多个参数,接收到的将是一个字典