JavaScript下的任何魔术(al)方法都是?
我在明确兴趣setter方法,getter方法和可调用(函数/方法),像我们在PHP:__set,__get和__call&& __callStatic.
我在谷歌上搜索和搜索StackOverflow,但没有结果.
如果有人被告知,请,谢谢!
有很多关于这个问题的SO问题,特别是这个问题,但它对我没有帮助.
有之间的模糊性property_exists和isset如此前问我的问题,我要指出来:
property_exists检查对象是否包含属性而不查看其值,它只查看其可见性.
所以在下面的例子中:
<?php
class testA
{
private $a = null;
}
class testB extends testA
{
}
$test = new testA();
echo var_dump(property_exists($test, 'a')); // true
// parent's private property becomes invisible for its child
$test = new testB();
echo var_dump(property_exists($test, 'a')); // false
Run Code Online (Sandbox Code Playgroud)
isset检查属性中是否存在值 如果值等于false,和,则设置为未设置null.
<?php
$var = null;
echo var_dump(isset($var)); // false
$var = '';
echo var_dump(isset($var)); // …Run Code Online (Sandbox Code Playgroud) 为了避免迷失在架构决策中,我会用一个类似的例子来问这个问题:
假设我想要一个像这样的Python类模式:
queue = TaskQueue(broker_conn)
queue.region("DFW").task(fn, "some arg")
Run Code Online (Sandbox Code Playgroud)
这里的问题是如何让设计成为一个类,以便某些方法可以以这种方式"链接".
task()需要访问queue类实例属性,操作task取决于输出region().
我看到SQLalchemy做了这个(见下文),但我很难深入挖掘他们的代码并隔离这种模式.
query = db.query(Task).filter(Task.objectid==10100)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用类似函数empty()并isset()使用方法返回的数据.
到目前为止我所拥有的:
abstract class FooBase{
public function __isset($name){
$getter = 'get'.ucfirst($name);
if(method_exists($this, $getter))
return isset($this->$getter()); // not working :(
// Fatal error: Can't use method return value in write context
}
public function __get($name){
$getter = 'get'.ucfirst($name);
if(method_exists($this, $getter))
return $this->$getter();
}
public function __set($name, $value){
$setter = 'set'.ucfirst($name);
if(method_exists($this, $setter))
return $this->$setter($value);
}
public function __call($name, $arguments){
$caller = 'call'.ucfirst($name);
if(method_exists($this, $caller)) return $this->$caller($arguments);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
class Foo extends FooBase{
private $my_stuff;
public function …Run Code Online (Sandbox Code Playgroud) 当我遇到一组奇怪的时序结果时,我正在搞乱一个小的自定义数据对象需要可以清洗,可比较和快速.这个对象的一些比较(和散列方法)只是委托给一个属性,所以我使用的是:
def __hash__(self):
return self.foo.__hash__()
Run Code Online (Sandbox Code Playgroud)
但经过测试,我发现它hash(self.foo)明显更快.出于好奇,我测试__eq__,__ne__和其他神奇的比较,才发现所有的人跑得更快,如果我用含糖的形式(==,!=,<等).为什么是这样?我认为加糖形式必须在引擎盖下进行相同的函数调用,但也许情况并非如此?
设置:围绕控制所有比较的实例属性的薄包装器.
Python 3.3.4 (v3.3.4:7ff62415e426, Feb 10 2014, 18:13:51) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>>
>>> sugar_setup = '''\
... import datetime
... class Thin(object):
... def __init__(self, f):
... self._foo = f
... def __hash__(self):
... return hash(self._foo)
... def __eq__(self, other):
... return self._foo …Run Code Online (Sandbox Code Playgroud) 如果您的问题作为此问题的重复项而被关闭,那是因为您有一个代码示例,其中包含以下任一内容:
class Example:
def __int__(self, parameter):
self.attribute = parameter
Run Code Online (Sandbox Code Playgroud)
或者:
class Example:
def _init_(self, parameter):
self.attribute = parameter
Run Code Online (Sandbox Code Playgroud)
当您随后尝试创建该类的实例时,会发生错误:
>>> Example("an argument")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Example() takes no arguments
Run Code Online (Sandbox Code Playgroud)
(在某些版本的 Python 中,错误可能会显示TypeError: object.__new__() takes no parameters。)
或者,该类的实例似乎缺少属性:
>>> class Example:
... def __int__(self): # or _init_
... self.attribute = 'value'
>>> Example().attribute
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Example' object has no …Run Code Online (Sandbox Code Playgroud) 我使用PHP 5.3,它引入了闭包.因为我现在在我的应用程序(和框架)中都有可用的闭包,所以我使用is_callable来查看是什么类型的处理程序$callback.
如果$callback is_callable,我足够了解并使用该函数/方法/闭包.如果它不可调用并且它是一个字符串,那么它可能是$this类中方法的名称.它可能存在,也可能不存在.如果我让它升级到PHP,它将"抛出"一个很好的致命错误(我喜欢那些).
但我想使用mix-ins,这意味着我需要魔术方法__call.__call非常酷,因为它(可以)在实际函数调用之前包含(s)逻辑.但是 ......如果在__call被叫方法不存在之后会发生什么?当然,我可以抛出一个例外,但直到之后我们才会知道.
问题现在是有用的is_callable,因为在实现之后__call,一切都将返回true,因为一切都有回退(存在__call).
有没有办法同时拥有:动态方法和有用的方法is_callable?
我希望看到的是某种可缓存的魔术方法__is_callable,PHP将在is_callable(array($object, $method))调用时"咨询" .
在php.net上,我找不到任何像我这样对此感到愚蠢的人.这不可能!如果你使用__call,你就不is_callable能再使用了!?
我有意义吗?
PS.我已经研究过了,method_exists但这还不够好(即使我可以过滤掉所有的闭包和全局函数),因为它将为私有和受保护的方法以及公共方法返回true.
编辑
我制作了一个'更好'的is_callable来检查混音,但我认为它非常昂贵.
加入包含对象的列表 - 在加入失败之前,我可以设置任何魔术方法将对象转换为字符串吗?
', '.join([…, Obj, …])
Run Code Online (Sandbox Code Playgroud)
我尝试过__str__,__repr__但都没有奏效
背景:对于那些不熟悉它的人, Sublime Text(和TextMate)通过由.tmLanguage语言定义文件定义的范围提供语法高亮和其他功能,基本上是一组用于识别给定语言中各种结构的正则表达式,例如函数定义,各种类型的字符串,保留字等
我是Python改进包的维护者(如果你感兴趣,可以通过Package Control获得),它旨在成为Python的更好的语言定义.如果需要,您可以在GitHub上阅读它,但其中一个关键特性是它实际上是维护的,这与许多未经过多年更改或更新的Sublime语言不同.
问题:我最近一直关注双重强调的__magic__东西,在找到Rafe Kettler关于魔术函数的优秀论文之后,我能够扩展语言定义的那一部分.但是,我找到一个很好的内置魔术变量名称或魔术属性列表,比如__class__或者运气少了__doc__.我已经浏览了文档的数据模型部分,但它为我的目的留下了一些不足之处,似乎主要关注魔术方法名称.
所以我的问题是,support.variable.magic.python范围应该包含哪些内容?这是它到目前为止的定义:
\b__(all|bases|class|debug|dict|doc|file|members|metaclass|methods|module|name|slots|weakref)__\b
Run Code Online (Sandbox Code Playgroud)
我开始这个项目的原因之一就是自学了更多关于Python的知识,到目前为止我确实取得了成功,但是我有点陷入困境.
为了清楚起见,我不是在寻找一个最喜欢的场外资源(尽管如果你有一个方便的链接,我会很感激)并且我不是要开始一个自以为是的讨论.我想弄清楚的是,这个列表是否看起来是合理的,或者是否有任何明显的错误.如果你确实想要自以为是,请打开一个问题,我非常乐意与你讨论.
谢谢!
magic-methods ×10
python ×6
php ×4
class ×2
isset ×2
built-in ×1
call ×1
javascript ×1
join ×1
overloading ×1
overriding ×1
performance ×1
properties ×1
python-2.7 ×1
sublimetext ×1
syntax ×1
typeerror ×1