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
加一个星,表示一个可变数量的位置参数,调用的时候传入多个参数,接收到的将是一个元组
加两个星,表示一个可变数量的名称参数,调用的时候传入多个参数,接收到的将是一个字典