标签: magic-methods

使python用户定义的类可排序,可清除

在python中使用户定义的类可排序和/或可清除时,需要覆盖/实现哪些方法?

有什么值得注意的?

我输入dir({})我的解释器以获取内置dicts的方法列表.其中,我假设我需要实现一些子集

['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']
Run Code Online (Sandbox Code Playgroud)

与Python2相比,Python3必须实现哪些方法有区别?

python sorting hash class magic-methods

70
推荐指数
3
解决办法
4万
查看次数

是否有可能重载Python赋值?

有没有一个可以重载赋值运算符的魔术方法,比如__assign__(self, new_value)

我想禁止重新绑定一个实例:

class Protect():
  def __assign__(self, value):
    raise Exception("This is an ex-parrot")

var = Protect()  # once assigned...
var = 1          # this should raise Exception()
Run Code Online (Sandbox Code Playgroud)

可能吗?这是疯了吗?我应该上药吗?

python methods class magic-methods assignment-operator

65
推荐指数
7
解决办法
3万
查看次数

PHP - 间接修改重载属性

我知道这个问题已被问过好几次了,但是他们都没有一个真正的答案来解决这个问题.也许有一个针对我的具体案例.

我正在构建一个mapper类,它使用magic方法__get()来延迟加载其他对象.它看起来像这样:

public function __get ( $index )
{
    if ( isset ($this->vars[$index]) )
    {
        return $this->vars[$index];
    }

    // $index = 'role';
    $obj = $this->createNewObject ( $index );

    return $obj;
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中我做:

$user = createObject('user');
$user->role->rolename;
Run Code Online (Sandbox Code Playgroud)

这项工作到目前为止.该User对象没有名为"role"的属性,因此它使用magic __get()方法创建该对象,并从"role"对象返回其属性.

但是当我尝试修改'rolename'时:

$user = createUser();
$user->role->rolename = 'Test';
Run Code Online (Sandbox Code Playgroud)

然后它给我以下错误:

注意:间接修改重载属性无效

不确定这是否仍然是PHP中的一些错误,或者它是否是"预期的行为",但无论如何它都不能按我想要的方式工作.这对我来说真的是一个阻止......因为我怎么能改变延迟加载对象的属性?


编辑:

当我返回包含多个对象的数组时,似乎只会发生实际问题.

我添加了一个代码片段来重现问题:

http://codepad.org/T1iPZm9t

你真的应该在你的PHP环境中运行它,真正看到'错误'.但这里有一些非常有趣的东西.

我试图改变一个对象的属性,这给了我通知'不能改变重载属性'.但是,如果我在之后回复该属性,我发现它实际上是DID改变了价值......真的很奇怪......

php magic-methods

53
推荐指数
3
解决办法
10万
查看次数

如何重载Python的__bool__方法?

可能重复:
在python中定义类的"boolness"

我认为这应该打印"False",为什么打印"True"?

>>> class Foo(object):
...   def __bool__(self):
...     return False
... 
>>> f = Foo()
>>> if f:
...   print "True"
... else:
...   print "False"
... 
True
>>>
Run Code Online (Sandbox Code Playgroud)

python methods overloading magic-methods

45
推荐指数
1
解决办法
1万
查看次数

特殊方法的Python文档在哪里?(__init __,__ new__,__ len _,...)

哪些是可以在类中使用的特殊双下划线/ dunder方法的完整列表?(例如,__init__,__new__,__len__,__add__)

python oop documentation class magic-methods

36
推荐指数
5
解决办法
2万
查看次数

使用PHP Magic Methods __sleep和__wakeup

有什么用的__sleep,并__wakeup在PHP魔术方法?我阅读了PHP文档,但仍然不清楚:

class sleepWakeup {

    public function __construct() {
        // constructor //
    }

    public function __sleep() {
        echo 'Time to sleep.';
    }

    public function __wakeup() {
        echo 'Time to wakeup.';
    }

}

$ob = new sleepWakeup();

// call __sleep method
echo $ob->__sleep();

echo "\n";

// call __wakeup method
echo $ob->__wakeup();
Run Code Online (Sandbox Code Playgroud)

此示例代码打印:

Time to sleep.
Time to wakeup.
Run Code Online (Sandbox Code Playgroud)

如果我重新命名__sleep,并__wakeupfoobar然后做同样的事情.这两种方法的正确用法是什么?

php oop magic-methods

36
推荐指数
4
解决办法
2万
查看次数

34
推荐指数
3
解决办法
1万
查看次数

如果 t.__str__() 返回非字符串,为什么 print(t) 错误,而不是 print(t.__str__()) ?

我试图理解__str__Python 中的方法。

class Test:
    def __str__(self):
        return 5

t = Test()

print(t.__str__())
Run Code Online (Sandbox Code Playgroud)

在此方法中,它返回一个整数值,但打印方法能够打印它。

但是,当我尝试时,print(t)它抛出了错误 TypeError: __str__ returned non-string (type int)

据我了解print(t),也在调用该__str__(self)方法。

为什么不print(t.__str__())想要字符串类型转换?

python type-conversion typeerror magic-methods

30
推荐指数
3
解决办法
1967
查看次数

是否有可能使用PHPUnit模拟对象期望调用magic __call()方法?

我在测试中有一个模拟对象.现实对象,PageRepository,实现了使用__call()魔术方法,所以如果你调用$ pageRepository-> findOneByXXXX($ value_of_field_XXXX),它会在数据库中搜索该参数匹配的记录.

有没有办法模拟这种方法?

真正的方法调用看起来像这样:

$homepage = $pageRepository->findOneBySlug('homepage');
Run Code Online (Sandbox Code Playgroud)

测试看起来像这样:

$mockPageRepository->expects($this->any())
    ->method('findOneBySlug')
    ->will($this->returnValue(new Page()));
Run Code Online (Sandbox Code Playgroud)

但它不起作用 - PHPUnit没有发现方法调用.让它看到方法的唯一方法是在PageRepository中显式定义方法.

php phpunit magic-methods symfony

29
推荐指数
2
解决办法
7420
查看次数

为什么调用Python的"魔术方法"不像对应的运算符那样进行类型转换?

当我从一个整数(例如1-2.0)中减去一个浮点数时,Python会进行隐式类型转换(我认为).但是当我使用魔术方法调用我认为是相同的操作时__sub__,它突然不再存在了.

我在这里错过了什么?当我为自己的类重载运算符时,除了明确地将输入转换为我需要的任何类型之外,还有其他方法吗?

a=1
a.__sub__(2.)
# returns NotImplemented
a.__rsub__(2.)
# returns NotImplemented
# yet, of course:
a-2.
# returns -1.0
Run Code Online (Sandbox Code Playgroud)

python type-conversion magic-methods implicit-conversion

29
推荐指数
2
解决办法
1677
查看次数