Python 为什么如此设计?

2022-12-19 08:04:11 +08:00
 chinesehuazhou
分享一篇文章: https://zhuanlan.zhihu.com/p/592658877



涉及 Python 语法设计、发展历史、编程思想等话题。
11087 次点击
所在节点    Python
81 条回复
msg7086
2022-12-19 09:06:49 +08:00
每次看到谈论 Python 的话题我都要去看看人们是怎么强行升华 len(arr)这种写法的。果然没让我失望。
julyclyde
2022-12-19 09:54:12 +08:00
还有就是,现在写文章的人比文章还多了
aloxaf
2022-12-19 09:54:15 +08:00
我认为由个人主导的语言,很多设计都可以归为作者的口味问题
分析它们的优劣是可以的,但是硬找上一堆理由还扯上对世界本质的洞察就实在有点……
Jwyt
2022-12-19 09:57:13 +08:00
我 tm 以为你是在问问题
BingoXuan
2022-12-19 09:57:56 +08:00
最后还不是调用__len__魔法方法。

python 既要 function programming 又要 object oriented programming 。但是 FP 中又不支持多行 lambda ,OOP 中 typing hints 又极其弱鸡(最近更新稍微好了点)。我是觉得这几年来进步乏善可陈。
superrichman
2022-12-19 09:58:54 +08:00
不错,值得参考
julyclyde
2022-12-19 10:09:32 +08:00
@BingoXuan 它一个外部函数,咋调进去“双下划线”方法的呢?好神奇啊
BeautifulSoap
2022-12-19 10:13:53 +08:00
@julyclyde 。。。。python 里又没有 private 的概念,所有方法都是 public ,直接 `a.__len__()` 就能调用了
urnoob
2022-12-19 10:17:03 +08:00
其他我都不管,我只知道基于游标卡尺的编程语言不是自我改进就是昙花一现
BingoXuan
2022-12-19 10:26:54 +08:00
@julyclyde
所谓的 magic 就是语言内部的调用 protocol (规范)。python 魔法方法很多,你甚至可以实现一个__get__的版本。
class Length:
def __get__(self,instance,owner):
return len(instance)
@classmethod
def create(cls)->int:
return cls()

class WithLength:
length = Length.create()
def __len__(self):
return 10
with_length = WithLength()
print(with_length.length)
MrSheng
2022-12-19 10:29:05 +08:00
@urnoob 非常喜欢游标卡尺这个表达。

锁进语法就是垃圾。
limbo0
2022-12-19 10:37:08 +08:00
Python 语言的定位挺适合缩进语法的
julyclyde
2022-12-19 10:39:02 +08:00
@BingoXuan 哦。我应该是搞混了
前后双下划线是可以被外部调用的
仅前双下划线是 private
spring3shine
2022-12-19 10:58:37 +08:00
写的很好,对我很有启发
zhanglintc
2022-12-19 11:10:20 +08:00
@julyclyde #13

草,你这么一说,的确是哈:

`__str__()`是可以被外部调用的。
`__foo()`是 private 的,不用奇技淫巧的话外部是调用不到的。

但是我没有印象在哪看到说**前后双下划线**是 public 的。
我一直只记住了**前双下划线**是 private 的。
突然有点蒙了。
julyclyde
2022-12-19 11:16:36 +08:00
@zhanglintc 所以,从外部调用“仅前双下划线”的奇技淫巧到底是什么呢?
leonshaw
2022-12-19 11:20:11 +08:00
@julyclyde name mangling
julyclyde
2022-12-19 11:22:30 +08:00
@leonshaw 哦,需要先 dir 一下
zhanglintc
2022-12-19 11:38:31 +08:00
@julyclyde #16

类似这样的对应关系,你自己加上前缀就可以访问到了:

zhanglintc
2022-12-19 11:39:48 +08:00
@julyclyde #16

`_A__b_`的箭头指错了,应该指到`__b_`。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/903396

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX