在很多讨论中我听到关于Ruby中,人们都表达了他们对语言的保留,猴子补丁的问题出来作为他们的主要关注点之一。

然而,我很少听到在Python的上下文中提出的相同的参数,尽管它是在Python语言也是允许的。

为什么这种区别?

Python不包括不同类型的保障措施以最小化该特征的风险?

有帮助吗?

解决方案

将作为Python程序员谁拥有了红宝石的味道(和喜欢它),我觉得有几分讽刺平行时的Python已经开始成为流行的。

C和Java程序员会“庆典”的Python,说明它不是一个真正的语言,它的类型的动态性将是危险的,让人们产生“坏”的代码。对于Python越来越流行,并且它的快速发展时间的优点变得显而易见,更不用说更简洁语法:

// Java
Person p = new Person();
# Python
p = Person()

我们开始看到一些更具活力的功能将出现在Java中的更高版本。自动装箱和-unboxing使其减少麻烦,处理原语和泛型允许我们一次代码,并将其应用到许多类型。

这是与一些娱乐,我看到的红宝石的键柔性特征中的一个 - 猴修补,由Python人群被吹捧为危险。已经开始了今年的教学红宝石给学生,我认为能够“修复”现有类的实现,甚至一个是系统的一部分,是非常强大的。

当然,你可以严重搞砸了,你的程序可能会崩溃。我可以在C段错误很容易地了。和Java应用程序可以死火死亡。

事实是,我看到猴修补如在动态和元编程下一步骤。有趣的,因为它已经出现自Smalltalk中。

其他提示

它在Python的技术更少实施,部分原因是由于在Python(那些用C语言实现)“核心”类是没有真正修改。在Ruby中,在另一方面,由于的方式,在内部(未更好,只是不同)几乎任何可以被动态地修改实现。

在哲学,它的东西,往往Python社区内进行皱起了眉头,显然较少所以在Ruby世界。我不知道为什么你断言,这是比较有争议的(你可以链接到一个权威性的参考?) - 我的经验是,猴子打补丁是,如果一个地方的用户应该知道的可能后果公认的技术

在语言可能允许它,但无论社会容忍的做法。的Monkeypatching没有在任何一种语言纵容,但你更经常听到它在Ruby中,因为公开课的它采用的形式使得它非常,非常容易猴补丁一类,由于这个原因,的这是在Ruby社区更容易接受,但在还是皱起了眉头。的Monkeypatching根本不是那么普遍或在Python一样简单,这就是为什么你不会听到在社区反对相同的论点。 Python做什么,Ruby没有做,以防止这种做法。

您听到的理由/ Ruby的更多的时候读到它的是,这在Ruby中:

class MyClass
  def foo
    puts "foo"
  end
end
class MyClass
  def bar
    puts "bar"
  end
end

会给你包含两个方法,foobar一类,而这在Python:

class MyClass:
    def foo(self):
        print "foo"
class MyClass:
    def bar(self):
        print "bar"

你会留下只包含方法bar,作为一个阶级的重新定义完全则会覆盖以前的定义的类。为了猴补丁在Python,你确实有这样写:

class MyClass:
    def foo(self):
        print "foo"
def bar(self):
    print "bar"
MyClass.bar = bar

这比红宝石版本更难。这本身使Ruby代码更容易比Python代码猴补丁。

“一词的Python包括不同类型的保障措施以最小化该特征的风险?”

是。社区拒绝这样做。保障完全是社会。

实际上在Python它有点难以修改基本类型。

例如可以想象,该重新定义的整数。

红宝石:

class Fixnum 
   def *(n)
      5 
   end 
end

现在2个* 2收率5。

的Python:

>>> class int(int):
    def __mul__(self, x):
        return 5


>>> 2*2
4
>>> int(2)*int(2)
5

在Python中,任何文字(""{}1.0等)创建的标准类的一个实例,即使你试图猴补丁它和在您的命名空间重新定义了相应的类。

这是行不通的,你打算如何:

class str():
    # define your custom string type
    ...

a = "foo"      # still a real Python string
a = str("foo") # only this uses your custom class

我认为猴修补应该仅被用作最后的解决方案。

通常Python程序员知道如何一个类或方法的行为。他们知道,类XXX被以某种方式做事情。

在猴补丁类或方法,则需要改变其行为。使用这个类的其他Python程序员可以很惊讶如果类表现不同。

做事的正常方式是子类。这样一来,其他程序员知道他们用的是不同的对象。如果他们选择,他们可以使用原来的类或子类。

如果你想要做在Python一些猴子补丁,它是相对容易的,只要你不修改内置类型(整数,浮点,STR)。

class SomeClass:
    def foo(self):
        print "foo"

def tempfunc(self):
    print "bar"
SomeClass.bar = tempfunc
del tempfunc

这将杆方法添加到SomeClass的那类偶数现有实例可以使用注射方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top