函数,方法以及必须给它们提供多少个参数?

时间:2018-11-15 14:23:27

标签: python string list function methods

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

str.upper('hello')

'hello'.upper()

我尝试对list.append做同样的事情,但得到了TypeError

list.append([1]) 

Python中的str类型是否已重载?如何通过编写类/函数来实现?我将不胜感激。

谢谢

RP。

4 个答案:

答案 0 :(得分:7)

Developers -> WebHooks带有两个参数-要修改的列表和要追加的元素。因此,您需要这样做:

list.append

等同于更为流行的:

ls = [1]
list.append(ls, 2)

答案 1 :(得分:6)

str.upperlist.append都是功能。

str.upper接受一个论点。

>>> str.upper('test')
'TEST'

list.append有两个参数。

>>> my_list = []
>>> list.append(my_list, 1)
>>> my_list
[1]

str.upperlist.append(与其他函数一样)也non-data-descriptors带有__get__方法,在这种情况下有两个含义:

  1. 当您通过类通过点标记(str.upperlist.append)访问该函数时,该函数的__get__方法(即string.upper.__get__list.append.__get__)被调用,但它仅返回函数本身。
  2. 当您通过实例my_string.uppermy_list.append)访问该函数时,将调用该函数的__get__方法,它将返回一个 new callable 的行为类似于原始函数,但“点之前”的内容会自动作为第一个参数传递。 。

这就是为什么在调用my_string.upper()时需要传递1-1 = 0的参数,而在调用my_list.append(1)时则需要传递2-1 = 1的原因。

>>> 'my_string'.upper()
'MY_STRING'
>>>
>>> my_list = []
>>> my_list.append(1)
>>> my_list
[1]

您甚至可以通过显式调用__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]

最后,这是一个简短的示例,说明描述符实例如何检测是否通过其所有者类或实例对其进行访问。

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'

答案 2 :(得分:3)

引用Dave KirbyRelationship between string module and str答案:

  

字符串模块和str类型之间有一些重叠,   主要是出于历史原因。在Python str对象的早期版本中   没有方法,所以所有的字符串操作都是通过   字符串模块中的函数。将方法添加到str时   类型(在Python 1.5中?),这些函数留在string模块中用于   兼容性,但现在只介绍等效的str方法。

     

但是字符串模块还包含常量和函数   不是str上的方法,例如格式,字符翻译等。

答案 3 :(得分:2)

str并没有什么神奇的事情(除了我们有一个很好的语法捷径来使用“”创建一个)。您可以编写行为类似于strlist的类,以更清楚地了解此处发生的情况。

class MyClass():
    def __init__(self, arg):
        self.val=str(arg)

    def do_thing(self):
        self.val = "asdf"

    def do_thing_with_arg(self, arg):
        self.val = "asdf " + str(arg)

    def __repr__(self):
        return self.val


my_thing = MyClass("qwerty")

# this is like 'hello'.upper()
my_thing.do_thing()
print(my_thing)
# it prints 'asdf'

my_thing = MyClass("qwerty")

# this is like str.upper('hello')
MyClass.do_thing(my_thing)
print(my_thing)
# it prints 'asdf'

my_thing = MyClass("qwerty")

# this is like my_list.append('qwerty')
my_thing.do_thing_with_arg('zxcv')
print(my_thing)
# it prints 'asdf zxcv'

my_thing = MyClass("qwerty")

# this is like list.append(my_list, 'qwerty')
MyClass.do_thing_with_arg(my_thing, 'zxcv')
print(my_thing)
# it prints 'asdf zxcv'

简短的版本是,您正在类上调用看起来像“实例方法”的 ,但是您是自己作为第一个实例提供实例('self')函数调用的参数。