以下几行为什么给我相同的结果?
str.upper('hello')
和
'hello'.upper()
我尝试对list.append
做同样的事情,但得到了TypeError
。
list.append([1])
Python中的str
类型是否已重载?如何通过编写类/函数来实现?我将不胜感激。
谢谢
RP。
答案 0 :(得分:7)
Developers -> WebHooks
带有两个参数-要修改的列表和要追加的元素。因此,您需要这样做:
list.append
等同于更为流行的:
ls = [1]
list.append(ls, 2)
答案 1 :(得分:6)
str.upper
和list.append
都是功能。
str.upper
接受一个论点。
>>> str.upper('test')
'TEST'
list.append
有两个参数。
>>> my_list = []
>>> list.append(my_list, 1)
>>> my_list
[1]
str.upper
和list.append
(与其他函数一样)也non-data-descriptors带有__get__
方法,在这种情况下有两个含义:
str.upper
,list.append
)访问该函数时,该函数的__get__
方法(即string.upper.__get__
和list.append.__get__
)被调用,但它仅返回函数本身。 my_string.upper
,my_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 Kirby的Relationship between string module and str答案:
字符串模块和str类型之间有一些重叠, 主要是出于历史原因。在Python str对象的早期版本中 没有方法,所以所有的字符串操作都是通过 字符串模块中的函数。将方法添加到str时 类型(在Python 1.5中?),这些函数留在string模块中用于 兼容性,但现在只介绍等效的str方法。
但是字符串模块还包含常量和函数 不是str上的方法,例如格式,字符翻译等。
答案 3 :(得分:2)
str
并没有什么神奇的事情(除了我们有一个很好的语法捷径来使用“”创建一个)。您可以编写行为类似于str
和list
的类,以更清楚地了解此处发生的情况。
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
')函数调用的参数。