Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dunder方法verus内置方法_Python_Oop - Fatal编程技术网

Python Dunder方法verus内置方法

Python Dunder方法verus内置方法,python,oop,Python,Oop,我举两个例子: a = [1,2,3] b = 4 print (a.__len__()) print (len(a)) print(b.__add__(4)) print (b + 4) 我想我的问题是,使用\u len\u魔术方法与内置len()方法有什么区别吗?我唯一一次看到人们使用\uuu len\uuu是在尝试查找用户创建的类的对象长度时 与其他dunder方法一样,例如\uuuu str\uuuuuuuuuuuuuuuuuuuuu或\uuuuuuuuuuuuuuuuuuuuuu

我举两个例子:

a = [1,2,3]
b = 4

print (a.__len__())
print (len(a))

print(b.__add__(4))
print (b + 4)
我想我的问题是,使用
\u len\u
魔术方法与内置
len()
方法有什么区别吗?我唯一一次看到人们使用
\uuu len\uuu
是在尝试查找用户创建的类的对象长度时


与其他dunder方法一样,例如
\uuuu str\uuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu添加
一般来说,我似乎从未在类或OOP之外使用过它们。<。函数只是一个函数,它调用len。差不多

def len(x):
   return x.__len__()
当然,您可以覆盖内置len,但这是dump(可能除了调试)。唯一不同的是len(x)更容易阅读,并且
x.\uu len\uuu
允许您创建自己的操作符实现
x._len__
也可以快一点,但这是使用它的一个很好的理由

当运算符有两个参数时,它的实现会执行更多操作
a+b
首先,它尝试调用
a.\uuuu add\uuuu
是否可调用,如果不可调用,则尝试调用
b.\uu radd\uuuu

这种“神奇方法”的要点是让您自定义对象在使用正常语法时的行为。当然,您可以将每个
foo=bar+baz
重写为
foo=
bar.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?!另外,我不认为这会在没有实现该方法的情况下调用委托,而
+
就是这样做的。