“toString”或“ToString”是高级编程语言中使用的主要格式化方法或函数。它将Object转换为其字符串表示形式,以便适合显示。
可以可以作为文本函数吗? 我在想像eval的倒数()。 函数derp(){a(); b(); C(); } 警报(derp.Asstring()); 结果就是 “ a(); b(); c();&...
Flutter toString() 在调试和发布模式下似乎有所不同
这是从 Flutter 3.10.5 迁移到 3.24.5 后发生的。 我在一个类上有一个方法,它使用带有要使用的 FontWeight 信息的 String 。基本上是这样的: 最后
我们在 PHP 中何处以及为何使用 __toString()?
我明白它是如何工作的,但我们为什么要实际使用它呢? 我明白它是如何工作的,但我们为什么要实际使用它? <?php class cat { public function __toString() { return "This is a cat\n"; } } $toby = new cat; print $toby; ?> 这不是和这个一样吗: <?php class cat { public function random_method() { echo "This is a cat\n"; } } $toby = new cat; $toby->random_method(); ?> 我们不能使用任何其他公共方法来输出任何文本吗? 为什么我们需要这样的神奇方法? 你并不“需要”它。但定义它可以让你的对象隐式转换为字符串,这很方便。 直接使用成员函数echo被认为是糟糕的形式,因为它给了类本身太多的输出控制权。您希望从成员函数返回字符串,并让调用者决定如何处理它们:是将它们存储在变量中,还是将它们取出,或者其他什么。使用魔术函数意味着您不需要显式函数调用来执行此操作。 除了所有现有答案之外,这里还有一个示例: echo 这是一个简单的类,可以帮助您管理 JavaScript。您可以通过调用 class Assets{ protected $queue = array(); public function add($script){ $this->queue[] = $script; } public function __toString(){ $output = ''; foreach($this->queue as $script){ $output .= '<script src="'.$script.'"></script>'; } return $output; } } $scripts = new Assets(); 来注册新脚本。 然后要处理队列并打印所有注册的脚本,只需调用 $scripts->add('...')。 显然这个类在这种形式下是没有意义的,但是如果你实现资产依赖、版本控制、检查重复包含等,它就开始有意义了(示例)。 基本思想是这个对象的主要目的是创建一个字符串(HTML),所以在这种情况下使用 __toString 很方便... 当对象传递给函数(尤其是 print $scripts; 或 __toString())且其上下文预计为字符串时,将调用 echo()。 由于对象不是字符串,因此 print() 处理将对象转换为某种字符串表示形式。 它只是生成对象的字符串表示形式的标准化方法。如果您假设程序中的所有对象都使用相同的方法,则您的 __toString() 方法有效,但如果您使用第三方库,情况可能并非如此。 您不需要魔术方法,但它提供了便利,因为您永远不需要显式调用它。 此外,如果 PHP 在内部想要将对象转换为文本,它知道如何做到这一点。 __toString 方法允许类决定当它被视为字符串时它将如何反应 http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring __toString 允许您定义对象转换为字符串时的输出。这意味着您可以打印对象本身,而不是函数的返回值。 看看下面的例子: random_method <?php class Student { protected $name; protected $age; public function getName(){ return $this->name; } public function getAge(){ return $this->age; } private function setName($name){ $this->name = $name; } private function setAge($age){ $this->age = $age; } public function __construct($name, $age) { $this->setName($name); $this->setAge($age); } public function __toString(){ return "hello ". $this->getName(). " my age is ". $this->getAge(); } } $obj = new Student("Sajib", 23); echo $obj; 允许您定义对象转换为字符串时的输出。 这意味着您可以 __toString 对象本身,而不是函数的返回值。 这通常更方便。请参阅手动输入。 使用 print 会覆盖打印该类对象时调用的运算符,因此可以更轻松地配置该类对象的显示方式。 __String 帮助我们在构造函数中出现错误时返回错误消息。 下面的虚拟代码会更好地阐明它。如果对象创建失败,则会发送错误字符串: __toString() 您不必专门调用 toString 方法。每当您打印对象时,都会隐式调用 toString 。任何其他方法都必须显式调用。 这是一个实现class Human{ private $fatherHuman; private $errorMessage =""; function __construct($father){ $errorMessage = $this->fatherHuman($father); } function fatherHuman($father){ if($father qualified to be father){ $fatherHuman = $father; return "Object Created";//You can have more detailed string info on the created object like "This guy is son of $fatherHuman->name" } else { return "DNA failed to match :P"; } } } function run(){ if(ctype_alpha($Rahul = Human(KingKong)){ echo $Rahul; } } run(); // displays DNA failed to match :P 的实际用例。假设您正在使用模型转换来返回一个处理不同状态逻辑的类。在您的数据库中,您存储简单的状态值,例如: __toString() 但是,您的自定义转换会将这些值转换为 NewStatus、InProgressStatus 和 ResolvedStatus 等类的实例。 这是对古老模式的现代方法。当处理多年前构建的遗留方法并且仍然期望纯字符串作为参数时,就会出现挑战。现在,您的模型返回一个状态对象而不是字符串。 您不想重构每个要使用的方法调用: 'new', 'in_progress', 'resolved' 相反,通过在状态类中添加 __toString() 方法: $model->status->getValue(); 任何需要字符串的方法现在都会自动接受 public function __toString() { return $this->getValue(); } ,无缝处理 $model->status、new 或 in_progress,而不会破坏现有代码。 这就像用 c# 覆盖: resolved
我正在尝试在一个名为 Employee() 的类中使用 toString()。我有一个 Employee 类型的一维数组,它存储员工数据,其中包括员工 ID、员工姓名、员工添加...
我正在尝试以荷兰语格式编写货币: €1.000,00 意义: 金额前的欧元符号 数千个点之间 分之间有一个逗号 但是,当我使用 CultureInfo“nl-NL” 或 ...
System.out.println(map); 所以结果是 {A=2, B=4, C=5 ..} 但我想要打印 甲2 乙4 碳5 ... 所以,我的处理器的提示是映射 toSting() 覆盖, 但我不明白 这是我的代码 地图管理类...
在下面的代码中使用 toString() 方法的目的是什么? [重复]
根据我的理解,toString() 方法允许类型转换,例如:int x = 5, sys....(x.toString()) 并将 5 打印到控制台。但是这样做的好处/坏处是什么
从 .NET Framework 4.7.2 移植到 .NET5.0 后如何避免“-0”作为 double.ToString() 结果?
我正在将 .NET Framework 4.7.2 Visual Studio 项目移植到 .NET5.0,当值为负且接近于零时,我遇到了 double.ToString 的不同行为。 例如,做...
美好的一天。 我有一个包含两列的 Excel 文件。第一列包含 12 个数字。其中一些有前导零。 我尝试在打开文件时指定“dtype=str”,但是 Pandas ...
我使用数组列表来保存不同形状的对象,这些对象是抽象超类的子类。超类包含两个抽象方法:分别是surface_area和volume。我打广告后...
如何定义泛化to_string和to_wstring以避免代码重复
我有许多用户定义的类,我想为其定义一个 to_string 函数。但是,我不想只为 std::string 定义它,而是为所有可能的情况定义它
如何告诉lxml.etree.tostring(element)不要在python中写命名空间?
我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 的条目 我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 <to_move>: 的条目 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move date="somedate"> <child>some text</child> ... ... </to_move> ... </some> 我使用 lxml.etree.iterparse 来迭代该文件。工作正常。当我找到带有标签 <to_move> 的元素时,我们假设它存储在变量 element 中,我这样做 new_file.write(etree.tostring(element)) 但这会导致 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move xmlns:="some" date="somedate"> # <---- Here is the problem. I don't want the namespace. <child>some text</child> ... ... </to_move> ... </some> 所以问题是:如何告诉 etree.tostring() 不要写 xmlns:="some"。这可能吗?我在 lxml.etree 的 api 文档中苦苦挣扎,但找不到满意的答案。 这是我找到的etree.trostring: tostring(element_or_tree, encoding=None, method="xml", xml_declaration=None, pretty_print=False, with_tail=True, standalone=None, doctype=None, exclusive=False, with_comments=True) 将元素序列化为其 XML 的编码字符串表示形式 树。 对我来说tostring()的每一个参数似乎都没有帮助。有什么建议或者更正吗? 我经常抓住一个命名空间来为它创建一个别名,如下所示: someXML = lxml.etree.XML(someString) if ns is None: ns = {"m": someXML.tag.split("}")[0][1:]} someid = someXML.xpath('.//m:ImportantThing//m:ID', namespaces=ns) 您可以执行类似的操作来获取名称空间,以便创建一个正则表达式,该正则表达式将在使用 tostring 后清理它。 或者您可以清理输入字符串。找到第一个空格,检查其后面是否有xmlns,如果有,则删除整个xmlns位直到下一个空格,如果没有则删除该空格。重复此操作,直到不再有空格或 xmlns 声明。但不要超过第一个>。 这更多是对“unutbu”答案的评论,其中需要清理命名空间的建议,但没有给出示例。这可能就是您正在寻找的... from lxml import objectify objectify.deannotate(root, cleanup_namespaces=True) 有一种方法可以使用 XSLT 删除名称空间: import io import lxml.etree as ET def remove_namespaces(doc): # http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="no"/> <xsl:template match="/|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet> ''' xslt_doc = ET.parse(io.BytesIO(xslt)) transform = ET.XSLT(xslt_doc) doc = transform(doc) return doc doc = ET.parse('data.xml') doc = remove_namespaces(doc) print(ET.tostring(doc)) 产量 <some> <to_move date="somedate"> <child>some text</child> </to_move> </some> 这是一个古老的问题,但由于 13 年后 lxml 仍然没有内置这个明显的函数,处理它的最简单方法是使用正则表达式: def get_text(element: etree.Element) -> str: s = etree.tostring(element).decode() if m := re.match(r'^<(\w*)[^>]*>((.|\n)+)<\/\1>', s): return m.group(2).strip() return s 这会剥离整个包含元素 <description blah blah blah><div>What we want</div><p>more stuff</p></description> 并仅返回 <description> 内的标记。为了安全起见,它会保存开始元素标记以在末尾进行匹配(使用 \1 反向引用),但寻找结束 <\ 效果很好,因为贪婪匹配会跳过内容中嵌入的所有其他元素。 如果匹配失败,引发 ValueError 可能会更好,但这只会返回原始的丑陋字符串、命名空间和所有内容。
StringBuilder.ToString() 抛出“索引超出范围”异常
我非常感谢有人帮助我解决以下问题: 我时不时地遇到以下异常: 指数超出范围。必须是非负数并且小于...的大小
使用 VB.NET 更改的事件文本框中输入字符串的格式不正确
我正在尝试使用事件文本框更改,但出现错误“输入字符串的格式不正确” 我的代码有问题吗? 或者 我的代码有问题吗
我正在尝试获取警报消息以打印之前在脚本中定义的变量。这是我的代码的alertcondition()部分: var boolalerttrigger = true 波浪趋势 1val = wt1 strWaveTre...
如何避免 `std::to_string()` 将一个非常小的双精度数变为 0?
我需要将非常小的双数存储为字符串格式,然后将它们反转。但是,当我尝试在 4.7816457028269855e-143 这样的小数字上运行 std::to_string() 时...
为什么使用 toString() 时没有创建 Java Array 类的对象?
这个问题是关于基础理论的。 让我向您展示代码: 导入java.util.Arrays; 公共类字符串操作{ 公共静态无效主(字符串[] args){ // 分裂 字符串...
std::to_string、boost::to_string 和 boost::lexical_cast 有什么区别<std::string>?
boost::to_string(在 boost/exception/to_string.hpp 中找到)的用途是什么?它与 boost::lexical_cast 和 std::to_string 有什么不同?
在 javascript 函数上调用 toString 返回源代码
我刚刚发现,当您在 javascript 函数上调用 toString() 时(如 myFunction.toString() 中),会返回该函数的源代码。 如果您在 Firebug 或 Chrome 控制台中尝试,我...