函数,方法以及我必须提供多少参数?

rp1*_*808 -3 python string methods function list

为什么以下几行给出了相同的结果?

str.upper('hello')
Run Code Online (Sandbox Code Playgroud)

'hello'.upper()
Run Code Online (Sandbox Code Playgroud)

我试着做同样的事list.append但得了一个TypeError.

list.append([1]) 
Run Code Online (Sandbox Code Playgroud)

strpython中的类型是否重载?如何通过编写类/函数来实现?我会很感激一个例子.

谢谢,

RP.

pel*_*lya 7

list.append有两个参数 - 要修改的列表和要追加的元素.所以你需要这样做:

ls = [1]
list.append(ls, 2)
Run Code Online (Sandbox Code Playgroud)

这相当于更受欢迎:

ls.append(2)
Run Code Online (Sandbox Code Playgroud)


tim*_*geb 6

str.upper并且list.append都是功能.

str.upper 有一个论点.

>>> str.upper('test')
'TEST'
Run Code Online (Sandbox Code Playgroud)

list.append 有两个论点.

>>> my_list = []
>>> list.append(my_list, 1)
>>> my_list
[1]
Run Code Online (Sandbox Code Playgroud)

str.upperlist.append(像其他函数一样)也是非数据描述符,其__get__方法在这种情况下有两个含义:

  1. 当您通过点表示法(str.upper,list.append)通过类访问函数时,函数的__get__方法(即string.upper.__get__list.append.__get__)被调用,但它只返回函数本身.
  2. 当你通过一个实例(my_string.upper,my_list.append)访问函数时,函数的__get__方法被调用,它将返回一个像原始函数一样的新调用函数,但是作为第一个参数自动传递的是"在点前"的任何东西..

这就是为什么你需要在调用时传递1 - 1 = 0个参数,在调用时需要传递my_string.upper()2 - 1 = 1个参数my_list.append(1).

>>> 'my_string'.upper()
'MY_STRING'
>>>
>>> my_list = []
>>> my_list.append(1)
>>> my_list
[1]
Run Code Online (Sandbox Code Playgroud)

可以甚至通过显式调用获取这些修改可调用(方法),__get__并传递要绑定的参数(所点之前)作为其参数.

>>> my_string = 'my_string'
>>> upper_maker = str.upper.__get__(my_string)
>>> upper_maker()
'MY_STRING'
>>> 
>>> my_list = []
>>> appender = list.append.__get__(my_list)
>>> appender(1)
>>> my_list
[1]
Run Code Online (Sandbox Code Playgroud)

最后,这是一个简短的示例,演示描述符实例如何检测它们是通过其所有者类还是通过实例进行访问.

class Descriptor:
    def __get__(self, instance, owner_class):
        if instance is None:
            print('accessed through class')
            # list.append.__get__ would return list.append here
        else:
            print('accessed through instance')
            # list.append.__get__ would build a new callable here
            # that takes one argument x and that internally calls
            # list.append(instance, x)

class Class:
    attribute = Descriptor()

Class.attribute # prints 'accessed through class'

instance = Class()
instance.attribute # prints 'accessed through instance'
Run Code Online (Sandbox Code Playgroud)