我知道python有一个len()用于确定字符串大小的函数,但我想知道为什么它不是字符串对象的方法.
好吧,我意识到我很尴尬.__len__()实际上是一个字符串对象的方法.使用字符串对象上的len函数在Python中看到面向对象的代码似乎很奇怪.此外,__len__将名称视为名称而不仅仅是len 也是奇怪的.
Python的Zen声明应该只有一种方法可以做 - 但我经常遇到决定何时使用函数与何时使用方法的问题.
让我们来看一个简单的例子 - 一个ChessBoard对象.假设我们需要一些方法来获得董事会所有合法的King移动.我们写ChessBoard.get_king_moves()或get_king_moves(chess_board)吗?
以下是我看到的一些相关问题:
我得到的答案基本上没有结果:
为什么Python使用某些功能的方法(例如list.index())但是其他功能(例如len(list))?
主要原因是历史.函数用于那些对一组类型通用的操作,这些操作甚至可以用于根本没有方法的对象(例如元组).当您使用Python的功能特性(map(),apply()等)时,拥有一个可以很容易地应用于无定形对象集合的函数也很方便.
事实上,实现len(),max(),min()作为内置函数实际上比将它们作为每种类型的方法实现它们的代码更少.人们可以对个别案例嗤之以鼻,但它是Python的一部分,现在进行这样的根本性改变为时已晚.必须保留这些功能以避免大量代码破坏.
虽然有趣,但上述内容并未真正说明采用何种策略.
这是原因之一 - 使用自定义方法,开发人员可以自由选择不同的方法名称,如getLength(),length(),getlength()或任何方法.Python强制执行严格命名,以便可以使用公共函数len().
稍微有点儿了.我的看法是函数在某种意义上是Pythonic版本的接口.
最后,来自Guido本人:
谈论能力/接口让我想到了一些我们的"流氓"特殊方法名称.在语言参考中,它说:"类可以通过定义具有特殊名称的方法来实现特殊语法(例如算术运算或下标和切片)调用的某些操作." 但是所有这些方法都有特殊的名称,
__len__或者__unicode__似乎是为了内置函数的优势而提供的,而不是为了支持语法.据推测,在基于接口的Python中,这些方法将变成ABC上的常规命名方法,这样就__len__可以了Run Code Online (Sandbox Code Playgroud)class container: ... def len(self): raise NotImplemented虽然,再考虑一下,我不明白为什么所有语法操作都不会在特定的ABC上调用适当的常用命名方法."
<"举例来说,大概会调用"object.lessthan"(或者是"comparable.lessthan").所以另一个好处是能够让Python远离这个错位名称奇怪,这在我看来是HCI的改进.嗯.我不确定我同意(数字:-).
有两点"Python基本原理"我想首先解释一下.
首先,由于HCI的原因,我选择len(x)而不是x.len()(
def __len__()后来发布).实际上有两个相互交织的原因,都是人机交互:(a)对于某些操作,前缀表示法只比读后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号.比较与我们改写像公式简单
x*(a+b)到x*a + x*b使用原始OO符号做同样的事情的笨拙.(b)当我阅读代码时,
len(x)我知道它是在询问某些东西的长度.这告诉我两件事:结果是一个整数,参数是某种容器.相反,当我阅读时x.len(),我必须知道这x是某种实现接口的容器或从具有标准的类继承len().当没有实现映射的类有一个get()或一个keys()方法,或者一个不是文件的东西有一个方法时,见证我们偶尔会遇到的困惑write().用另一种方式说同样的事情,我认为'len'是一种内置 操作 …
Python 有诸如__add__、__mul__、__cmp__等等(称为魔术方法)之类的方法,它们被用作类方法,并且可以赋予加法(+)、乘法(*)、比较(==)……类的两个实例不同的含义. 我的问题是其他语言有类似的方法吗?我熟悉 Java、C++、ruby 和 PHP,但从未遇到过这样的事情。我知道所有四个都有一个对应于 的构造函数方法__init__,但是其他魔术方法呢?
我尝试在谷歌上搜索“其他编程语言中的魔术方法”,但没有显示任何相关内容,可能它们在不同语言上有不同的名称。