Python 为什么可以';";字符串";。打印()?

Python 为什么可以';";字符串";。打印()?,python,ruby,Python,Ruby,我对Python和Ruby(以及其他语言)中的print()的理解是,它是字符串(或其他类型)上的方法。因为它是如此常用的语法: 打印“嗨” 工作 那么,为什么Python中的“hi”.print()或Ruby中的“hi”.print不工作呢?当您执行类似“hi”.print()的操作时,您意味着字符串对象“hi”有一个方法print。事实并非如此。相反,print是一个以字符串(或其他类型)作为输入的函数。为什么它要工作?字符串类很少有voidprint方法,而且您永远不会需要它们,因为标准的

我对Python和Ruby(以及其他语言)中的
print()
的理解是,它是字符串(或其他类型)上的方法。因为它是如此常用的语法:

打印“嗨”

工作


那么,为什么Python中的
“hi”.print()
或Ruby中的
“hi”.print
不工作呢?

当您执行类似
“hi”.print()
的操作时,您意味着字符串对象
“hi”
有一个方法
print
。事实并非如此。相反,
print
是一个以字符串(或其他类型)作为输入的函数。

为什么它要工作?字符串类很少有void
print
方法,而且您永远不会需要它们,因为标准的静态
print
函数无论如何都可以打印这些字符串。需要注意的是:
method(someObject)
someObject不一定相同。method()

print
在Python(或者我相信在Ruby)中不是字符串上的方法。它是一个语句(在Python3中是一个全局函数)。为什么?首先,并非所有可以打印的内容都是字符串。打印2怎么样?

它不是字符串上的方法。在此之前,它是一个语句(就像
中断
导入
),您可以同时使用
打印“hi”
打印(“hi”)
。在Python3中,它是通过一个函数实现的,因此您不能再使用
打印“hi”

打印是一种功能

print语句已替换为 函数,用关键字参数替换大多数 旧打印语句(PEP 3105)的特殊语法


你有什么建议
str.print
应该做什么

打印到标准输出?斯特德怎么样?还是文件?还是串口

打印到标准输出确实是一个特例,但它是如此普遍,以至于有时会被忽略

然后我们必须指定每次创建字符串时str应该打印到哪里

至少我们得说

"foo".print(sys.stdout)

希望你也觉得这很糟糕。这是一种职责混淆

Ruby确实有一个方法
对象#display
(),它将对象的表示形式发送到当前输出流,或者指定为参数


(我发现,如果我在一行末尾使用
来抑制返回值的打印,那么在irb中很难使用它;如果我这样做,
显示
的输出就不会显示,即使我刷新了流。)

如果你更乐意使用Ruby中的方法而不是语句,你可以使用方法显示(
“test”.display
)以实现此目的或定义一种新方法,如

class String
  def print
    puts self
  end
end
像这样使用它

"test".print

我不确定,但认为Ruby中没有语句或保留词。只有一个方法如果你给一个字符串对象一个打印方法,为什么你要停在那里,系统中的每个对象都应该有一个打印方法。与切片、搜索等相比,打印并不是一种特别像字符串的操作。。。打印只是一种特殊形式的I/O,你看不到像整数和字符串这样的对象,它们的写入方法以文件句柄为参数。为什么这个问题得到了这么多的赞成票,而实际上是“为什么我不能键入随机垃圾并运行它”?什么时候开始从完全无知走向语言的?@MatthewTrevor:别紧张。“这个问题是关于什么成为一个方法,什么成为一个全局函数,等等背后的逻辑。这是对这个问题的一个比我能处理的更宽泛的解释。”MatthewTrevor考虑到echristopherson的回答,我不认为这是一个愚蠢的问题。这只适用于Python。Ruby没有函数,只有方法。在Ruby中,
print
IO
协议的一种方法,例如由
IO#print
StringIO#print
实现。另外,还有一个方便的方法
Kernel#print
,它基本上调用
$>.print
,其中
$>
是一个全局变量,表示默认的输出IO流(通常,
$>
指向
标准输出,但它不必这样做)。正是这种方便的方法允许您只说
print'Hi'
,而不说
$>。打印'Hi'
STDOUT.print'Hi'
。我不知道
对象#display
,所以大拇指朝上,尽管我认为我不喜欢它的存在,因为任何给定的对象都无法神奇地知道如何打印自己(因为a:它应该是什么样子?像self.to_或self.inspect等,b:它如何知道自己打印到哪里?$stdout或$stderr或某个随机文件或套接字或什么?每个对象都需要知道流的可怕依赖性)@Joshua Check:如果您不指定要输出到的流,它将使用伪全局
$>
的值,我在查找它之前都不知道它的存在。对这样的对象进行猴子修补通常是一个坏习惯,尤其是在这样的情况下,您会创建巨大的依赖关系。我知道在这种情况下,它不会伤害您由于print在内核中,但这只是一个例外(可以写一篇完整的博客文章)。每个人都有权发表自己的意见,我在这里看不到任何依赖性,但当你使用一个方法时,它必须在你的代码中的某个地方定义,它取决于IO流和全局变量
$stdout