Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.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描述符协议模拟?_Python_Language Features_Encapsulation - Fatal编程技术网

其他语言中的Python描述符协议模拟?

其他语言中的Python描述符协议模拟?,python,language-features,encapsulation,Python,Language Features,Encapsulation,是否有类似于用其他语言实现的Python描述符协议的东西?这似乎是一种在不增加包含类的实现的情况下增加模块化/封装的好方法,但我从未在任何其他语言中听说过类似的事情。因为查找开销,它可能在其他语言中不存在吗?我也没有听说过直接的等价物。使用宏可能会达到同样的效果,特别是在像Lisp这样的语言中,它具有非常强大的宏 如果其他语言开始合并类似的东西,我一点也不会感到惊讶,因为它非常强大。Ruby和C#都可以通过为属性指定getter/setter方法轻松创建访问器,这与Python中的情况非常相似。

是否有类似于用其他语言实现的Python描述符协议的东西?这似乎是一种在不增加包含类的实现的情况下增加模块化/封装的好方法,但我从未在任何其他语言中听说过类似的事情。因为查找开销,它可能在其他语言中不存在吗?

我也没有听说过直接的等价物。使用宏可能会达到同样的效果,特别是在像Lisp这样的语言中,它具有非常强大的宏

如果其他语言开始合并类似的东西,我一点也不会感到惊讶,因为它非常强大。

Ruby和C#都可以通过为属性指定getter/setter方法轻松创建访问器,这与Python中的情况非常相似。然而,这并不是为了让您自然地以Python允许的方式在另一个类中编写这些方法的代码。实际上,我不确定这有多重要,因为每次我看到通过描述符协议定义的属性都是在同一个类中实现的

编辑:该死我的阅读障碍(我指的是粗心的阅读)。出于某种原因,我总是把“描述符”读作“装饰器”,反之亦然,即使是我同时输入了这两个词。我将保留我的帖子,因为它有有效的信息,尽管这些信息与问题完全无关

术语“装饰者”本身实际上是著名的“设计模式”一书中描述的设计模式的名称。Wikipedia文章包含许多不同编程语言的decorator用法示例:

但是,那篇文章中的装饰器是面向对象的;它们有实现预定义接口的类,该接口允许另一个现有类以某种方式表现出不同的行为,等等。Python装饰器通过在运行时用另一个函数替换一个函数,从而以函数的方式工作,允许您有效地修改/替换该函数、插入代码等

这在Java世界中被称为面向方面编程,AspectJ Java编译器允许您执行这些操作,并将AspectJ代码(Java的超集)编译成Java字节码

我对C#或Ruby不够熟悉,不知道它们的装饰器版本是什么。

这与Python中的不同——我指的是将对象实例转换为另一个对象的属性的能力,该属性被“代理”为动态。