Python要求您显式传递self
作为所有类函数的第一个参数,这似乎有点奇怪。还有其他语言需要类似的东西吗?
答案 0 :(得分:5)
通过显式,你的意思是“明确地作为参数传递给每个类函数”? 如果是这样,那么Python就是我唯一知道的。
大多数OO语言以某种形式支持this
或self
,但大多数语言都允许您定义类函数,而无需始终将self
定义为第一个参数。
答案 1 :(得分:4)
根据你的观点,Lua。引用引用:“调用v:name(args)是v.name(v,args)的语法糖,除了v只计算一次。”您还可以使用两种表示法定义方法。所以你可以说Lua有一个可选的显式自我。
答案 2 :(得分:4)
编程语言Oberon 2有一个明确的名为但没有为类的成员函数显式传递'this'或'self'参数(在Oberon术语中称为类型绑定过程)
以下示例是Text类型的Insert方法,其中指定标识符't'以绑定到显式'this'或'self'引用。
PROCEDURE (t: Text) Insert (string: ARRAY OF CHAR; pos: LONGINT);
BEGIN ...
END Insert;
有关Oberon中面向对象的详细信息,请here。
答案 3 :(得分:3)
F#(可能来自其OCAML遗产)要求所有自我引用的明确名称;虽然名称是任意标识符,例如
override x.BeforeAnalysis() =
base.BeforeAnalysis()
DoWithLock x.AddReference
这里我们定义了一个重写成员函数BeforeAnalysis
,它调用另一个成员函数AddReference
。这里的标识符x
是任意的,但在声明和对“this”/“self”实例的成员的任何引用中都是必需的。
答案 4 :(得分:2)
Modula-3。这并不太令人惊讶,因为Python的类机制是a mixture of the ones found in Modula-3 and C++。
答案 5 :(得分:1)
任何Object-Oriented language在成员函数中都有这个或自我的概念。
答案 6 :(得分:0)
许多面向对象的语言(如果不是全部的话)
例如c ++支持“this”而不是“self”
但你不必通过它,它被动地传递
希望有所帮助;)
答案 7 :(得分:0)
Clojure不是OOP语言,但在某些情况下确实使用显式自我参数:最明显的是当你实现一个协议时,“self”参数(你可以将它命名为你喜欢的任何东西)是第一个协议方法的参数。然后将该参数用于多态分派以确定正确的函数实现,例如:
(defprotocol MyProtocol
(foo [this that]))
(extend-protocol MyProtocol String
(foo [this that]
(str this " and " that)))
(extend-protocol MyProtocol Long
(foo [this that]
(* this that)))
(foo "Cat" "Dog")
=> "Cat and Dog"
(foo 10 20)
=> 200
此外,函数的第一个参数通常用于表示正在作用的对象,例如,以下代码附加到向量:
(conj [1 2 3] 4)
=> [1 2 3 4]