在python中使用户定义的类可排序和/或可清除时,需要覆盖/实现哪些方法?
有什么值得注意的?
我输入dir({})我的解释器以获取内置dicts的方法列表.其中,我假设我需要实现一些子集
['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']
Run Code Online (Sandbox Code Playgroud)
与Python2相比,Python3必须实现哪些方法有区别?
有没有一个可以重载赋值运算符的魔术方法,比如__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)
可能吗?这是疯了吗?我应该上药吗?
我知道这个问题已被问过好几次了,但是他们都没有一个真正的答案来解决这个问题.也许有一个针对我的具体案例.
我正在构建一个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中的一些错误,或者它是否是"预期的行为",但无论如何它都不能按我想要的方式工作.这对我来说真的是一个阻止......因为我怎么能改变延迟加载对象的属性?
编辑:
当我返回包含多个对象的数组时,似乎只会发生实际问题.
我添加了一个代码片段来重现问题:
你真的应该在你的PHP环境中运行它,真正看到'错误'.但这里有一些非常有趣的东西.
我试图改变一个对象的属性,这给了我通知'不能改变重载属性'.但是,如果我在之后回复该属性,我发现它实际上是DID改变了价值......真的很奇怪......
可能重复:
在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) 哪些是可以在类中使用的特殊双下划线/ dunder方法的完整列表?(例如,__init__,__new__,__len__,__add__)
有什么用的__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,并__wakeup以foo和bar然后做同样的事情.这两种方法的正确用法是什么?
我试图理解__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__())想要字符串类型转换?
我在测试中有一个模拟对象.现实对象,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中显式定义方法.
当我从一个整数(例如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)