我想将一个对象转换为一个数组,这样我就可以对其进行循环迭代。
我知道:
$array = (array) $object
Run Code Online (Sandbox Code Playgroud)
存在。但我想要一些类似习俗的东西
__toString()
Run Code Online (Sandbox Code Playgroud)
数组的方法。
我知道到目前为止
__toArray()
Run Code Online (Sandbox Code Playgroud)
不存在。
问题:
我可以自定义创建这个魔法方法吗?如何创建?
(我也知道一个事实,我可以通过调用一个返回数组的函数来解决这个问题)
我想将对象转换为自定义数组:
foreach($object as $key=>$value) {}
Run Code Online (Sandbox Code Playgroud)
不通过调用函数来转换它
foreach($object->toArray as $key=>$value){}
Run Code Online (Sandbox Code Playgroud)
即使这是最简单的方法......
我可以在 Rabbit 类中添加一个数字,但反过来不行:
class Rabbit:
def __init__(self, age):
self.age = age
def __add__(self, rabbit):
if isinstance(rabbit, int):
return self.age + rabbit
else:
return self.age + rabbit.age
print(Rabbit(10) + 5)
print(5 + Rabbit(10))
Run Code Online (Sandbox Code Playgroud)
最后一行返回:
TypeError: unsupported operand type(s) for +: 'int' and 'Rabbit'
Run Code Online (Sandbox Code Playgroud)
那是因为在第一个打印表达式(有效)中Rabbit.__add__被称为地下,而在第二个表达式中int.__add__被调用并且该int.__add__方法不适用于兔子。完成这项工作的最佳方法是什么?我希望能够将整数添加到兔子和兔子到整数。
是否有“思维导图”、UML 图、图形或一些针对不同 Python 类型及其必须实现的神奇方法的可靠参考?
\n我正在使用 Python 3.8。数据模型文档和内置类型文档非常简洁,它将帮助我了解 python 中不同类型存在的不同协议的高级概述(我已经“学习”(阅读?) ,例如,要实现“类似不可变”的对象,您必须遵守Immutable ProtocolPython中的 ,这意味着您必须实现__len__和__getitem__。要使其“类似可变”,您必须进一步添加__setitem__和__delitem__)。
我没有看到(据我搜索到的)Python 文档中使用了“协议”一词,并且最接近的良好描述似乎来自集合抽象基类模块。然而,作为一个新手,我不确定是否collections.abc完全是别的东西,或者那里提供的信息是否适用于 python 内置类型(即list、tuple、dict等;特别是因为collections.abc文档指出它“提供[es]替代方案)到 Python\xe2\x80\x99s 通用内置容器、字典、列表、集合和元组”,第二个是因为我不会想到去collections Python\xe2\x80\x99s 通用内置容器、字典、列表、集合和元组”,其次是因为如果我想了解 python 中的默认内置函数,模块语言本身)。
有人有可靠的资源吗?如果信息采用某种继承关系格式,这样信息就不会重复,这将很有帮助。例如,在我上面的例子中,与其说一个mutable-like对象实现了__len__、__getitem__、__setitem__和__delitem__,不如说如果它被“分块”并且信息类似于“一个mutable-like对象继承immutable-like并添加__setitem__,和__delitem__。
有什么想法吗?我认为这对新手来说是一个巨大的困惑源,许多错误都是由于对 python 数据类型的误解而导致的。
\n我正在尝试为链接列表创建一个链接列表节点类,如代码所示:
class LNode:
def __init__(self, data=None, pnext=None):
self.data = data
self.pnext = pnext
def __str__(self):
return f"{self.data} -> {self.pnext}"
def __repr__(self):
return f"{self.data} -> {self.pnext}"
def __len__(self):
print("len method called...")
cnt = 1
return cnt
def headInsert(self, nextNode):
nextNode.pnext = self.pnext
self.pnext = nextNode
def headInsert_woh(self, nextNode):
nextNode.pnext = self
return nextNode
def tailInsert(self, nextNode):
print("tail-insert called...")
tail = self
while tail.pnext:
tail = tail.pnext
tail.pnext = nextNode
return self
def __add__(self, other):
return self.tailInsert(other)
Run Code Online (Sandbox Code Playgroud)
定义后,我尝试了以下代码:
a = LNode(1)
for …Run Code Online (Sandbox Code Playgroud) 对于任何看过/使用过Magento的人,请告诉我在哪里可以找到以下3个函数对Catalog Product的保存操作的Event Observer类的定义: -
setBundleOptionsData()setBundleSelectionsData()setCanSaveBundleSelections()请原谅我,问这么愚蠢的问题,但我真的很无奈.任何帮助是极大的赞赏.
最糟糕的是,以上3种方法以很好的方式用于产品对象,并且它们也在起作用.但他们的定义在哪里?
编辑: -
好的,我可以理解这些是"Varien_Object"使用的,这些是使用Magic Methods概念的简单setter函数.但是当程序计数器到达这样一个函数时,有人可以告诉编码流是什么,在这种情况下是在Event Observer类中吗?
我创建了一个带有构造函数和toString方法的类,但它不起作用.
class Course
{
protected $course
public function __construct()
{
$this->$course = "hello";
}
public function __toString()
{
$string = (string) $this->$course;
return $string;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Fatal error: Cannot access empty property
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
$string = (string) $course;
Run Code Online (Sandbox Code Playgroud)
什么都没打印出来.
虽然我熟悉Java的toString方法,但我不熟悉PHP中的魔术方法.
我想知道Python中是否有支持type()内置函数的魔术方法,它允许您设置要返回的自定义值.
我写了一个名为Task的小抽象类.我喜欢让每个任务逻辑类扩展它.
在我的抽象类"Task"中,我喜欢调用在每个类中定义的已使用的已定义方法"execute".
我试图使用魔法,__call但它不起作用.
如果您在我的方法中注意到我正在回显一条从未在屏幕上打印的消息.
这是我的抽象Task类
<?php
namespace App\Modules\Surveys\Tasks;
use App\Modules\Surveys\Tasks\Support\Traits\HtmlHelper;
abstract class Task
{
/*
|
| This task base class provides a central location to place any logic that
| is shared across all of your tasks.
|
*/
use HtmlHelper;
/**
* checks wether a get method execute exists and calls it
*
* @param string $name
* @param array $args optional
* @return mixed
*/
public function __call($name, $args = [])
{
echo 'Attempt to …Run Code Online (Sandbox Code Playgroud) 我最近尝试在我的几个类上实现"传递",以允许使用该__getattr__方法调用类的特定属性上的方法.这已经在ipython中破坏了(类型)自动完成,我很想知道为什么.第一:
class MyClass(object):
def __init__():
#create an instance of class ClassProperty
self.class_property = ClassProperty()
def __getattr__(self, item):
#pass through calls to non-existent methods, print first
print item
return getattr(self.class_property,item)
Run Code Online (Sandbox Code Playgroud)
当创建这个类的一个实例,然后试图制表完成在IPython中(0.12.1),似乎几个函数被调用,包括__methods__,trait_names和_getAttributeNames.
In [1]: my_class = MyClass()
In [2]: my_class.not_in_my_class<tab>
__methods__
trait_names
_getAttributeNames
Run Code Online (Sandbox Code Playgroud)
我很想知道发生了什么.
谢谢,
PS我知道这样做是非常不透明的,而且是暂时的.不过,我很好奇.
UPDATE
基于我从下面接受的答案中学到的东西,我已经能够成功地"通过"自动完成,以便ClassProperty现在存在于自动完成实例中的方法MyClass.成功通过所需的是对该__dir__方法的更新
class MyClass(object):
def __init__():
#create an instance of class ClassProperty
self.class_property = ClassProperty()
def __getattr__(self, item):
#pass through calls to …Run Code Online (Sandbox Code Playgroud) 我试图掌握PHP的魔术方法,为此我创建了一个如下所示的测试类:
<?php
class overload
{
protected $lastCalledParam;
public $param;
public function __construct()
{
return $this->switchConstruct(func_get_args());
}
protected function switchConstruct(array $args)
{
switch (count($args))
{
case 0:
return print "0 params<br />";
case 1:
return call_user_func_array(array($this, 'constr1'), $args);
case 2:
return call_user_func_array(array($this, 'constr2'), $args);
}
die("Invalid number of args");
}
protected function constr1($a)
{
print "constr1 called<br />";
}
protected function constr2($a, $b)
{
print "constr2 called<br />";
}
public function __get($name)
{
$this->lastCalledParam = $name;
return $this->{$name};
}
public function …Run Code Online (Sandbox Code Playgroud)