当我打电话self::$parameter = 1;给__set不叫.
有办法解决吗?
目前我在YII框架中工作,在那里我创建了一个扩展CFormModel的类,
在该类中,我重写以下函数:
public function __get($name)
public function __set($name, $value)
Run Code Online (Sandbox Code Playgroud)
我已经进行了以下检查,以确保end_date和start_date不为空
if(!empty($this->end_date) AND !empty($this->start_date))
{
**/*Not Working*/**
/*Some Application Logic*/
}
Run Code Online (Sandbox Code Playgroud)
但它没有正常工作,条件不满意.当我调试代码时,我开始知道$this->start_date并且$this->end_date不是空的.之后我将检查更改为以下内容:
if($this->end_date!='' AND $this->start_date!='')
{
**/*Working*/**
/*Some Application Logic*/
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,但我仍然不明白为什么空函数不能正常工作.是因为魔法还是有这个问题的原因?
我的问题是,我们有一堂课:
class SomeClass{
private $someProperty;
public function __call($name,$arguments){
echo "Hello World";
}
Run Code Online (Sandbox Code Playgroud)
现在当我说:
$object = new SomeClass();
$object->someMethod();
Run Code Online (Sandbox Code Playgroud)
我的类中的__call方法将被调用.
当我说
$object->getSomeProperty();
Run Code Online (Sandbox Code Playgroud)
将__call再次被调用?如果是这样,那么__get和__set魔术方法是什么用的?
当我说
$object->someProperty;
Run Code Online (Sandbox Code Playgroud)
然后会调用__get($ someProperty)?或者它会__set($ someProperty)?
我正在尝试用Python创建一个模块,允许我编写一个有效的句子map(_ + 2, range(10)),只是为了好玩,但有一个奇怪的行为,我不知道如何处理.我目前的实施是:
class EasyLambda(object):
def __add__(self, other):
return lambda val: val + other
_ = EasyLambda()
Run Code Online (Sandbox Code Playgroud)
每个操作员都有自己的功能.这是愚蠢的实现,我稍后会改进它以使事情成为_.lower() + '.html'可能.问题是,每当我调用一个魔术方法时,Python似乎用新返回的值替换self,在这种情况下这是一个lambda.
>>> from mymodule import _
>>> print _
<func.EasyLambda object at 0x2e4ae90>
>>> add2 = _ + 2
>>> print add2, _
<function <lambda> at 0x2e551b8> <func.EasyLambda object at 0x2e13e90>
>>> add2(4)
6
>>> print add2, _
<function <lambda> at 0x2e551b8> 6 # WTF?
>>> print _, type(_)
6 <type 'int'>
>>> _ + 4 …Run Code Online (Sandbox Code Playgroud) 我只想创建像getFieldname()magento 中一样的函数。
例如:
在 Magento 中
getId()ID- 返回字段值
getName()Name- 返回字段值
我怎样才能创建这样的功能?在这种情况下请帮助我..
我想做的就像下面的代码一样,
Class Called{
$list=array();
function __construct() {
$this->list["name"]="vivek";
$this->list["id"]="1";
}
function get(){
echo $this->list[$fieldname];
}
}
$instance=new Called();
$instance->getId();
$instance->getName();
Run Code Online (Sandbox Code Playgroud) 考虑这个类的安排 - 特别是神奇函数 __invoke:
class Barman {
public function __construct() {
// .. .constructor stuff - whatever
}
public function makeDrink() {
return "vodka martini, shaken";
}
}
class Bar {
private $arr_barmen = array();
public function __construct() {
$this->arr_barmen['john'] = new Barman();
}
public function __invoke($barman_id) {
echo "I have been invoked";
return $this->arr_barmen[$barman_id];
}
public function aBarFunc($param) {
return "yes it worked ," .$param;
}
}
class Foo {
public $myBar;
public function __construct() {
$this->myBar = new …Run Code Online (Sandbox Code Playgroud) 我构建了一个矩阵计算器,我想创建一种用于与标量相乘的mul方法,以及另一种用于与其他矩阵相乘的 mul 方法。我有一个 if-else 块,但我更喜欢它采用两种不同的方法,但我希望它们都可以与 * 运算符一起使用。我该怎么做呢?
我正在使用 Sphinx 的自动摘要为模块的每个成员自动生成单独的第一个文件。文档按预期创建,只是生成的第一个文件缺少除__init__.
在我的conf.py我有以下几行:
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.autosummary',
]
autosummary_generate = True
autosummary_imported_members = True
Run Code Online (Sandbox Code Playgroud)
考虑下面的虚拟类,它包含 dunder 和常规公共方法:
class MyClassA:
def __init__(self):
r'__init__ docstring'
pass
def __call__(self):
r'__call__ docstring'
pass
def __len__(self):
r'__len__ docstring'
pass
def public_method_1(self):
r'public_method_1 docstring'
pass
def public_method_2(self):
r'public_method_2 docstring'
pass
Run Code Online (Sandbox Code Playgroud)
在我的第一个主文件中,我设置了自动摘要,如下所示:
.. autosummary::
:toctree: my_module_members
my_module.MyClassA
my_module.MyClassB
Run Code Online (Sandbox Code Playgroud)
/my_module_members正如预期的那样,自动摘要会为模块的每个成员创建一个以单独的第一个文件命名的子目录。但仅__init__在这些自动生成的第一个文件的“方法”部分中列出。例如:
my_module.MyClassA
==================
.. currentmodule:: my_module
.. autoclass:: MyClassA
.. rubric:: Methods
.. autosummary::
~MyClassA.__init__
~MyClassA.public_method_1
~MyClassA.public_method_2
Run Code Online (Sandbox Code Playgroud)
因此,在生成的 html 文档中,方法表中仅列出了这三个方法,而没有 …
python是否有任何方法可以轻松快速地创建CLI实用程序,而无需大量的参数解析样板?
在Perl 6中,MAIN子的签名自动解析命令行参数.
有没有办法在没有大量样板的情况下在Python中做类似的事情?如果没有,最好的方法是什么?我正在考虑一个函数装饰器,它将执行一些内省并做正确的事情.如果没有什么比这更好的了,我会想到的东西就像我下面的东西.这是一个好主意吗?
@MagicMain
def main(one, two=None, *args, **kwargs):
print one # Either --one or first non-dash argument
print two # Optional --arg with default value (None)
print args # Any other non-dash arguments
print kwargs # Any other --arguments
if __name__ == '__main__':
main(sys.argv)
Run Code Online (Sandbox Code Playgroud) python method-signature perl6 command-line-arguments magic-methods
我有一个类,我希望__hash__()为这个类编写一个方法.我想写的方法将在某些情况下返回对象的默认哈希值,并在其他一些情况下返回其属性之一的哈希值.所以,作为一个简单的测试案例:
class Foo:
def __init__(self, bar):
self.bar = bar
def __hash__(self):
if self.bar < 10:
return hash(self) # <- this line doesn't work
else:
return hash(self.bar)
Run Code Online (Sandbox Code Playgroud)
这个问题就是hash(self)简单地调用self.__hash__(),导致无限递归.
我收集到一个对象的哈希是基于该对象的哈希id(),所以我可以重写return hash(self)为return id(self),或者return id(self) / 16,但是在我自己的代码中重新创建默认实现似乎是不好的形式.
我也想到我可以把它重写为return object.__hash__(self).这可行,但似乎更糟糕,因为不打算直接调用特殊方法.
所以,我要问的是; 有没有办法使用对象的默认哈希而不隐式调用该__hash__()对象是该实例的类的方法?