问题标签 [magic-methods]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1872 浏览

python - 魔术方法上的 @StaticMethod 或 @ClassMethod 装饰

我正在尝试将魔术方法装饰__getitem__为课堂上的类方法。这是我尝试过的示例。我不介意使用 classmethod 或 staticmethod 装饰,但我不太确定该怎么做。这是我尝试过的:

但是,当我尝试打电话时,Settings['database']我收到以下错误。

谁能告诉我我做错了什么。另外,有人可以建议是否有更好的方法来做到这一点?我什至尝试使用 MetaClasses,但收效甚微(因为我不太了解 python)。

提前致谢。

0 投票
4 回答
6496 浏览

php - __get/__set/__call 使用 PHP 的性能问题

我有一个定制的 MVC PHP 框架,我正在重写它,并且对性能和魔术方法有疑问。对于框架的模型部分,我在想__get/__set魔术方法是否会导致太多的性能损失值得使用。我的意思是访问(读取和写入)模型数据将是最常见的事情之一。对于像 MVC 框架的模型部分这样的重度使用功能来说,使用__get/__set魔术方法对性能的影响太大了吗?

0 投票
3 回答
2112 浏览

php - 用 __get() 和 __set() 模拟公共/私有属性?

我正在编写一个类,它使用__get()__set()在主数组中存储和检索数组元素。我进行了检查以使某些元素变得难以捉摸,基本上是为了重新创建私有属性。

我注意到它似乎__get拦截了对类属性的所有调用。这对我来说很糟糕,因为我希望有一个外部世界私有的变量(通过 get 不可用),但我试图通过直接从类中引用主数组来访问它。当然,主数组不在可获取属性的白名单中:(

有没有办法可以在使用__get()and的 php 类中模拟公共和私有属性__set()

例子:

0 投票
3 回答
5329 浏览

php - PHP - Zend 说避免魔术方法?

我正在阅读这个页面 - http://deaduseful.com/blog/posts/50-php-optimisation-tips-revisited

其中一项建议是避免使用从 Zend Performance PDF 中引用的魔术方法,该 PDF 没有给出建议避免使用它们的理由。

经过一些谷歌搜索(并在这里结束一个不相关的问题),我想知道是否有人在这方面有任何建议?

我在我的代码中经常使用 __get(),通常是为了保存我不经常使用的变量,例如

我可能有一个带有名称、描述、类别 ID、添加时间的表

我的 get 看起来像这样:

这似乎是一种很好的做事方式,因为我只会在需要时从数据库中获取一些东西,并且我可以引用诸如 $article->time_added 之类的东西,而不是摆弄数组。

这会被认为是不好的做法和服务器上的额外负载吗?

通常,如果子类与 get 中的某些内容不匹配,我会使用魔术方法扩展类并执行类似的操作。

这会是不好的做法并且对性能不利吗?扩展魔术方法时,我拥有的最大级别数是三个。

0 投票
3 回答
3959 浏览

php - Python 等效于 PHP 的 __call() 魔术方法?

在 PHP 中,我可以这样做:

能够在 Python 中为我正在处理的项目执行此操作会很方便(需要解析大量令人讨厌的 XML,将其转换为对象并能够调用方法会很好。

Python有等价物吗?

0 投票
3 回答
222 浏览

php - __set 和字符串连接

我想知道这是否可能:

我已成功使用 __set() 魔术方法将值设置为类的属性:

所以我能够:

例如,当我想连接一个字符串时,问题就来了。似乎 __set() 没有被调用(实际上它没有被调用)。

这会输出“大家好”。我无法在第二个作业中执行 __set() 。阅读 php.net 它说:

因此,由于a_string已经存在,所以不会调用 __set。我的问题最后是......我怎样才能实现连接操作?

注意: 好的... Murphy 在我发布此消息后立即给了我答案...

答案(据我所知)是 PHP 无法确定a_string是否可用,因为我没有定义 __get() 方法。

定义 __get() 允许 php 找到 a_string 的当前值然后使用 __set() 连接该值。

0 投票
1 回答
246 浏览

python - 向模块添加神奇的全局方法

我开始进入 Python 日志记录模块,但除非我希望所有消息都说“root”,否则我必须为每个模块创建一个记录器,而且一遍又一遍地这样做有点痛苦。

我在想,如果有一种神奇的__logger__()方法可以为当前模块返回一个记录器,并在必要时创建它,那将会很方便。可以不带括号调用的魔术__logger__变量会更好。我该怎么做呢?

例如,在一个名为 foo 的模块中,我可以调用__logger__.debug('this is a debug message for the foo module'),它会在我的控制台中显示为:

DEBUG:foo:这是 foo 模块的调试消息

0 投票
2 回答
3249 浏览

php - PHP 警告魔法方法 set() class.XMLHttpRequest.php

我有一个运行完美的 php 脚本,但出现 2 个错误:

这很重要吗?我可以让它消失吗?或修复?

提前致谢!

0 投票
1 回答
1278 浏览

cakephp - 使用 beforeFilter 的 CakePHP 奇怪行为:我无法将变量设置为视图

好的,这将需要一些设置:

我正在研究一种在我的 cakePHP 驱动博客的 URL 中使用漂亮的帖子标题“slugs”的方法。

例如:/blog/post-title-here而不是/blog/view_post/123.

由于我显然不会为每篇文章都编写一个新方法,因此我试图巧妙地使用 CakePHP 回调来模拟 PHP 5__call()魔术方法的行为。对于那些不知道的人,CakePHP 的调度程序会检查一个方法是否存在,并__call()在控制器调用之前抛出一个 cakePHP 错误。

到目前为止我所做的:

为了充分披露(因为我不知道为什么会遇到问题),我有两条路线:

这些为 BlogPostsController 设置了一个别名,这样我的 url 看起来就不像/blog_posts/action

然后在 BlogPostsController 中:

beforeFilter捕获不存在的动作并将它们传递给我的single_post方法。 single_post从模型中获取数据,并$post为视图设置一个变量。

还有一种index方法可以显示最近的 10 个帖子。

这是令人困惑的部分:

你会注意到$this->render上面有一个方法被注释掉了。

  1. 当我调用$this->render('single_post')时,视图呈现一次,但未设置$post变量。
  2. 当我调用$this->render('single_post'),视图会使用$post变量 set 进行渲染,然后再次使用未设置的变量进行渲染。所以实际上我在同一个文档中得到了两个完整的布局,一个接一个。一个有内容,一个没有。

我试过使用一个名为的方法single_post和一个名为的方法__single_post,它们都有同样的问题。我希望最终结果是一个名为的方法__single_post,这样就不能直接使用 url 访问它/blog/single_post

当帖子不存在时,我还没有编写错误处理代码(因此当人们在 url 中键入随机内容时,他们不会得到 single_post 视图)。在我弄清楚这个问题后,我打算这样做。

0 投票
6 回答
923 浏览

python - Python 神奇的 main() 签名,如 Perl 6

python 是否有任何方法可以轻松快速地制作 CLI 实用程序,而无需大量参数解析样板文件?

在 Perl 6 中,MAINsub的签名会自动解析命令行参数。

有没有办法在没有大量样板的情况下在 Python 中做类似的事情?如果没有,最好的方法是什么?我正在考虑一个函数装饰器,它将执行一些自省并做正确的事情。如果没有什么已经喜欢它,我在想像我下面的东西。这是一个好主意吗?